MySQL-Suche über mehrere Felder

ie123

Grünschnabel
Guten Abend,

Ich hätte da gern mal ein Problem :-)

Ich versuche seit einiger Zeit eine MySQL-Abfrage zusammen zu stellen, aber irgendwie scheinen MySQL und ich verschiede
Sprachen zu sprechen oder wir haben Differenzen bei der Logik.

SELECT * from Tabelle 1 where feld1='wert1' AND (feld2='wert2' OR feld2='wert3' OR feld2='wert4' OR feld3 = 'wert5' OR feld3='wert6')
Meine Logik sagt: feld1 MUSS wert1 beinhalten und feld2 oder feld3 können die Werte 2-6 beinhalten.
Wenn beides zutrifft, nimm den Datensatz.
MySQL liefert mir aber auch DS, wenn die Bedingungen nach dem AND zutreffen.
Dies soll aber nicht so sein. Es sollte so sein, dass die Bedingung vor dem AND ein MUSS ist und eine der Bedingungen nach dem AND muss zutreffen.

Wo ist hier der Fehler?

Lieben Gruß,
Ingo
 
Zeig mal wie die gespeicherten Daten aussehen, wie du genau (mit Werten) die Abfrage ausführst und was dabei rauskommt!
 
Zeig mal wie die gespeicherten Daten aussehen, wie du genau (mit Werten) die Abfrage ausführst und was dabei rauskommt!

SELECT * FROM db.orders,db.order_ctr WHERE (db.orders.ordernumber LIKE '%4711%' OR db.orders.ship LIKE '%4711%' OR db.orders.buyer LIKE '%4711%' OR db.orders.bl LIKE '%4711%' OR db.orders.master_bl LIKE '%4711%' OR db.order_ctr.cnumber LIKE '%4711%' OR db.orders.ship LIKE '%4711%') AND ( db.orders.departure_city = 'CCCC' OR db.orders.destination_city = 'BBBB') GROUP BY db.orders.uuid ORDER BY ordernumber DESC

Das Problem hierbei ist, dass obwohl die 4711 in den DS nicht gefunden wird, trotzdem DS angezeigt werden, die auf departure_city oder destination_city zutreffen.
 
SQL:
SELECT * 
FROM `db`.`orders` AS `o`, `db`.`order_ctr` AS `c`
WHERE (`o`.`ordernumber` LIKE '%4711%' 
    OR `o`.`ship` LIKE '%4711%' 
    OR `o`.`buyer` LIKE '%4711%' 
    OR `o`.`bl` LIKE '%4711%' 
    OR `o`.`master_bl` LIKE '%4711%' 
    OR `o`.`ship` LIKE '%4711%'
    OR `c`.`cnumber` LIKE '%4711%') 
  AND `o`.`departure_city` IN ('CCCC', 'BBBB') 
GROUP BY `o`.`uuid`
ORDER BY `o`.`ordernumber` DESC

Mit dem Syntaxhighlighter sieht es doch gleich viel freundlicher aus.
Du hast da 2 Tabellen, haste die auch richtig verknüpft? So das MySQL weiß wie er Joinen muss.
 
Zuletzt bearbeitet von einem Moderator:
item: Du hast 2 Tabellen die NICHT verknüpft sind. Ist das wirklich so?

item: Anstatt 20 mal auf denselben Wert prüfen kannst du auch mit MATCH...AGAINST mehrere Spalten durchsuchen

SQL:
SELECT *
FROM 
	`db`.`orders` AS `o`, 
	`db`.`order_ctr` AS `c`
WHERE
	-- Hier noch eine Tabellenverknüpfung
	MATCH (
			`o`.`ordernumber`, 
			`o`.`ship`, 
			`o`.`buyer`, 
			`o`.`bl`, 
			`o`.`master_bl`, 
			`o`.`ship`, 
			`c`.`cnumber`
		) AGAINST ('4711' )
	AND `o`.`departure_city` IN ('CCCC', 'BBBB') 
GROUP BY 
	`o`.`uuid`
ORDER BY 
	`o`.`ordernumber` DESC
 
Zuletzt bearbeitet von einem Moderator:
SQL:
WHERE db.order_ctr.order_uuid=db.orders.uuid AND
...
hatte ich mal drin stehen, machte aber Probleme, wenn eines der Felder leer war.
Werde das dann wieder reinnehmen.
Ich schätze das ist der Join, den ihr meint, oder?

LG,
Ingo
 
Zuletzt bearbeitet von einem Moderator:
Das ist ein INNER JOIN. Jepp. Erklär mal das mit NULL. ggf kann man es über einen LEFT JOIN lösen
 
Die Order wird nicht gefunden, wenn sie in der Containertabelle keinen Eintrag hat.
In der Ordertabelle stehen alle Sachen , die über die Order wissenswert sind.
Die Tabelle Container bekommt Einträge, wenn Container zur Order hinzugefügt werden.
Wenn kein Container in der Order ist, wurde die Order nicht gefunden, daher war meine Vermutung, dass es damit zu tun hat.
Ich habe schon überlegt, direkt mit anlegen der Order einen Leercontainer anzulegen, um das Problem zu umgehen.

Noch was merkwürdiges:
Ich habe die Abfrage jetzt mit MATCH AGAINST gemacht und die Full-Text-Indices eingerichtet.
Wenn ich nach CSCL suche, werden einige Schiffe angezeigt, CSCL Seestar, CSCL Zeebruegge, usw.
Wenn ich nach der Ordernummer suche, muss die immer ganz genau passen.
Eine Order mit der Nummer: "Ingo123" wird mit der Suche nach "Ingo" nicht gefunden.
Warum?
 
Die Order wird nicht gefunden, wenn sie in der Containertabelle keinen Eintrag hat.
In der Ordertabelle stehen alle Sachen , die über die Order wissenswert sind.
Die Tabelle Container bekommt Einträge, wenn Container zur Order hinzugefügt werden.
Wenn kein Container in der Order ist, wurde die Order nicht gefunden, daher war meine Vermutung, dass es damit zu tun hat.
Ich habe schon überlegt, direkt mit anlegen der Order einen Leercontainer anzulegen, um das Problem zu umgehen.

Du Solltest mit LEFT JOIN arbeiten um das Problem zu lösen.
http://dev.mysql.com/doc/refman/5.1/de/join.html
 
Das mit dem Leftjoin wusste ich so nicht, Danke!
Habe es gestern Abend noch mit meinem Workaround programmiert und es geht.
Aber warum MySQL bei der Suche so komisch, wie oben beschrieben, reagiert, weiß´ich immer noch nicht :-(
 
Zurück