3 Stimmen

Mysql - Helfen Sie mir, diese Abfrage zu ändern, um AND-Logik anstelle von OR bei der Suche anzuwenden?

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

2voto

Gary Punkte 2796

Ziemlich einfach, wenn Sie Group and Having verwenden. Damit sollten Sie das bekommen, wonach Sie suchen.

SELECT id_tutor FROM Tutoren_Tag_Beziehungen AS td INNER JOIN Tags AS t ON t.id_tag = td.id_tag WHERE t.tag LIKE "%key1%" oder t.tag LIKE "%schlüssel2%" group by id_tutor having count(id_tutor)>1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X