Führen Sie zunächst diese Tabellen und Datenabzüge aus :-
CREATE TABLE IF NOT EXISTS `Tags` (
`id_tag` int(10) unsigned NOT NULL auto_increment,
`tag` varchar(255) default NULL,
PRIMARY KEY (`id_tag`),
UNIQUE KEY `tag` (`tag`),
KEY `id_tag` (`id_tag`),
KEY `tag_2` (`tag`),
KEY `tag_3` (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=18 ;
INSERT INTO `Tags` (`id_tag`, `tag`) VALUES
(1, 'key1'),
(2, 'key2');
CREATE TABLE IF NOT EXISTS `Tutors_Tag_Relations` (
`id_tag` int(10) unsigned NOT NULL default '0',
`id_tutor` int(10) default NULL,
KEY `Tutors_Tag_Relations` (`id_tag`),
KEY `id_tutor` (`id_tutor`),
KEY `id_tag` (`id_tag`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `Tutors_Tag_Relations` (`id_tag`, `id_tutor`) VALUES
(1, 1),
(2, 1);
Die folgende Abfrage findet alle Tutoren aus der Tabelle Tutors_Tag_Relations, die einen Bezug zu mindestens einem der Begriffe "key1" oder "key2" haben.
SELECT td . *
FROM Tutors_Tag_Relations AS td
INNER JOIN Tags AS t ON t.id_tag = td.id_tag
WHERE t.tag LIKE "%key1%"
OR t.tag LIKE "%key2%"
Group by td.id_tutor
LIMIT 10
Bitte helfen Sie mir, diese Abfrage so zu ändern, dass sie alle Tutoren aus der Tabelle Tutors_Tag_Relations zurückgibt, die einen Bezug zu den beiden Begriffen "key1" und "key2" haben (UND-Logik statt ODER-Logik). Bitte schlagen Sie eine optimierte Abfrage vor, die eine große Anzahl von Datensätzen berücksichtigt (die Abfrage sollte NICHT zwei Gruppen von Tutoren, die zu jedem Schlüsselwort passen, einzeln abrufen und dann die Schnittmenge finden).
Update
Die Frage wird auf die nächste Ebene gehoben. Bitte führen Sie die folgenden neuen Abfragen durch :-
\===================================================================================
TABELLE ERSTELLEN, WENN NICHT VORHANDEN learning_packs_tag_relations
( id_tag
int(10) ohne Vorzeichen NO id_tutor
int(10) DEFAULT NU id_lp
int(10) ohne Vorzeichen DEF KEY Learning_Packs_Tag_Relations_FKIndex1
( id_tag
) SCHLÜSSEL id_lp
( id_lp
) SCHLÜSSEL id_tag
( id_tag
) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
TABELLE ERSTELLEN, WENN NICHT VORHANDEN learning_packs
( id_lp
int(10) ohne Vorzeichen NOT id_status
int(10) unsigned NOT N id_author
int(10) ohne Vorzeichen NOT NULL DEFAULT name
varchar(255) NOT NUL PRIMARY KEY ( id_lp
) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;
TABELLE ERSTELLEN, WENN NICHT VORHANDEN tutors_tag_relations
( id_tag
int(10) ohne Vorzeichen NOT id_tutor
int(10) DEFAULT NULL,
SCHLÜSSEL Tutors_Tag_Relations
( id_tag
), SCHLÜSSEL id_tutor
( id_tutor
) SCHLÜSSEL id_tag
( id_tag
) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
TABELLE ERSTELLEN, WENN NICHT VORHANDEN users
( id_user
int(10) unsigned NOT NULL AUTO_INCREMENT, name
varchar(100) NOT NUL surname
varchar(155) NOT NULL DEFAULT '',
PRIMARY KEY ( id_user
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=52 ;
TABELLE ERSTELLEN, WENN NICHT VORHANDEN tutor_details
( id_tutor
int(10) NOT NULL A id_user
i PRIMARY KEY ( id_tutor
) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=60 ;
TABELLE ERSTELLEN, WENN NICHT VORHANDEN tags
( id_tag
int(10) ohne Vorzeichen NOT NUL tag
varchar(255) DEFAULT PRIMARY KEY ( id_tag
) UNIQUE KEY tag
( tag
) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
ALTER TABLE learning_packs_tag_relations
ADD CONSTRAINT Learning_Packs_Tag_Relations_ibfk_1
FOREIGN KEY ( id_tag
) REFERENZEN tags
( id_tag
) BEIM LÖSCHEN KEINE AKTION BEIM AKTUALISIEREN KEINE AKTION;
ALTER TABLE learning_packs
ADD CONSTRAINT Learning_Packs_ibfk_2
FOREIGN KEY ( id_author
) REFERENZEN users
( id_user
) BEIM LÖSCHEN KEINE AKTION BEIM AKTUALISIEREN KEINE AKTION;
ALTER TABLE tutors_tag_relations
ADD CONSTRAINT Tutors_Tag_Relations_ibfk_1
FOREIGN KEY ( id_tag
) REFERENZEN tags
( id_tag
) BEIM LÖSCHEN KEINE AKTION BEIM AKTUALISIEREN KEINE AKTION;
INSERT INTO test
. users
( id_user
, name
, surname
) VALUES ( NULL , 'Vivian', 'Richards' ), ( NULL , 'Sachin', 'Tendulkar' );
INSERT INTO test
. users
( id_user
, name
, surname
) VALUES ( NULL , 'Don', 'Bradman' );
INSERT INTO test
. tutor_details
( id_tutor
, id_user
) VALUES ( NULL , '52' ), ( NULL , '53' );
INSERT INTO test
. tutor_details
( id_tutor
, id_user
) VALUES ( NULL , '54' );
INSERT INTO test
. tags
( id_tag
, tag
) VALUES ( 1 , 'Vivian' ), ( 2 , 'Richards' );
INSERT INTO test
. tags
( id_tag
, tag
) VALUES (3, 'Sachin'), (4, 'Tendulkar'); INSERT INTO test
. tags
( id_tag
, tag
) VALUES (5, 'Don'), (6, 'Bradman');
INSERT INTO test
. learning_packs
( id_lp
, id_status
, id_author
, name
) VALUES ('1', '1', '52', 'Kricket 1'), ('2', '2', '52', 'Kricket 2');
INSERT INTO test
. tags
( id_tag
, tag
) VALUES ('7', 'Cricket'), ('8', '1'); INSERT INTO test
. tags
( id_tag
, tag
) WERTE ('9', '2');
INSERT INTO test
. learning_packs_tag_relations
( id_tag
, id_tutor
, id_lp
) WERTE ('7', '52', '1'), ('8', '52', '1'); INSERT INTO test
. learning_packs_tag_relations
( id_tag
, id_tutor
, id_lp
) WERTE ('7', '52', '2'), ('9', '52', '2');
\===================================================================================
Über das neue System - - Das System hat jetzt 4 weitere Tabellen - Tutoren, Benutzer (verbunden mit tutor_details), learning_packs, learning_packs_tag_relations - Tutoren erstellen Pakete - Tag-Relationen für Tutoren werden in tutors_tag_relations gespeichert und die für Pakete in learning_packs_tag_relations.
Jetzt möchte ich nach learning_packs suchen, mit der gleichen UND-Logik. Helfen Sie mir, die folgende Abfrage so zu ändern, dass die Suche nach dem Namen des Lernpakets oder dem Namen des Tutors und dem Nachnamen alle aktiven Lernpakete ergibt (entweder direkt diese Lernpakete oder die von diesen Tutoren erstellten Lernpakete).
\==================================================================================
select lp.*
von Learning_Packs AS lp
LEFT JOIN Learning_Packs_Tag_Relations AS lptagrels ON lp.id_lp = lptagrels.id_lp
LEFT JOIN Tutoren_Tag_Relations as ttagrels ON lp.id_author = ttagrels.id_tutor LEFT JOIN Lehrer_Details as td ON ttagrels.id_tutor = td.id_tutor LEFT JOIN Users as u on td.id_user = u.id_user
JOIN Tags as t on (t.id_tag = lptagrels.id_tag) or (t.id_tag = ttagrels.id_tag)
where lp.id_status = 1 AND ( t.tag LIKE "%Vivian%" OR t.tag LIKE "%Richards%" )
group by lp.id_lp HAVING count(lp.id_lp) > 1 limit 0,20
Wie Sie sehen, führt die Suche nach "Cricket 1" zu diesem Paket, aber die Suche nach Vivian Richards führt nicht zu demselben Paket.
Bitte um Hilfe