Ich brauche Hilfe beim finden meiner SQL-Query fehler! Bitte

Hallööchen!

Ich habe ein problem mit zwei Unterschiedlichen gleichen SQL-Abfragen. Die eine dauert wenige Sekunden die andere liegt im schnitt bei 15 Minuten.

Ich hoffe wirklich ihr könnt mir helfen.

Query 1:

SELECT count(*) AS Falsch, filialdaten_online.verlag_nr 
	FROM filialdaten_online 
	JOIN filialdaten_quelle 
	ON filialdaten_online.verlag_nr = filialdaten_quelle.verlag_gs 
		
	/* Hier beginnt die Suche nach möglichen Treffern */
	WHERE produkt_id = 3 
		AND abfragedatum_id = 258 
		AND lieferdatum_id = 56 
		AND filialdaten_online.plz LIKE CONCAT(SUBSTR(filialdaten_quelle.plz, -CHAR_LENGTH(filialdaten_quelle.plz), 3), "%") 
		AND filialdaten_online.strasse LIKE CONCAT(SUBSTR(filialdaten_quelle.strasse , -CHAR_LENGTH(filialdaten_quelle.strasse),CHAR_LENGTH(filialdaten_quelle.strasse)- 3), "%") 
		AND filialdaten_online.hausnummer LIKE CONCAT("%", SUBSTR(filialdaten_quelle.hausnummer, -CHAR_LENGTH(filialdaten_quelle.hausnummer), 3), "%") 
		
		/* Hier ist die Suche der möglichen treffern beendet */
		/* Jetzt beginnt das Filtern nach den Abweichenden. */
		
		AND (
		LTRIM(LCASE(filialdaten_online.bezeichnung)) != LTRIM(LCASE(filialdaten_quelle.bezeichnung))
		OR LTRIM(filialdaten_online.plz) != LTRIM(filialdaten_quelle.plz)
		OR LTRIM(LCASE(filialdaten_online.ort)) != LTRIM(LCASE(filialdaten_quelle.ort))
		OR LTRIM(LCASE(filialdaten_online.strasse)) != LTRIM(LCASE(filialdaten_quelle.strasse))
		OR LTRIM(filialdaten_online.hausnummer) != LTRIM(filialdaten_quelle.hausnummer)
		OR LTRIM(REPLACE(`filialdaten_online`.`telefonnummer`, " ", "")) != LTRIM(REPLACE(CONCAT(filialdaten_quelle.vorwahl, filialdaten_quelle.telefonnummer), " ", ""))
		OR LTRIM(LCASE(REPLACE(filialdaten_online.homepage, "http://", ""))) != LTRIM(LCASE(REPLACE(filialdaten_quelle.homepage, "http://", "")))
		OR LTRIM(REPLACE(`filialdaten_online`.`faxnummer`, " ", "")) != LTRIM(REPLACE(CONCAT(filialdaten_quelle.vorwahl, filialdaten_quelle.faxnummer), " ", "")) 
		OR LTRIM(REPLACE(filialdaten_online.montag, " - ", "-")) != LTRIM(REPLACE(filialdaten_quelle.montag, " - ", "-"))
		OR LTRIM(REPLACE(filialdaten_online.dienstag, " - ", "-")) != LTRIM(REPLACE(filialdaten_quelle.dienstag, " - ", "-"))
		OR LTRIM(REPLACE(filialdaten_online.mittwoch, " - ", "-")) != LTRIM(REPLACE(filialdaten_quelle.mittwoch, " - ", "-"))
		OR LTRIM(REPLACE(filialdaten_online.donnerstag, " - ", "-")) != LTRIM(REPLACE(filialdaten_quelle.donnerstag, " - ", "-"))
		OR LTRIM(REPLACE(filialdaten_online.freitag, " - ", "-")) != LTRIM(REPLACE(filialdaten_quelle.freitag, " - ", "-"))
		OR LTRIM(REPLACE(filialdaten_online.samstag, " - ", "-")) != LTRIM(REPLACE(filialdaten_quelle.samstag, " - ", "-"))
		OR LTRIM(REPLACE(filialdaten_online.sonntag, " - ", "-")) != LTRIM(REPLACE(filialdaten_quelle.sonntag, " - ", "-"))
		)

		AND filialdaten_quelle.id IN (SELECT filialdaten_quelle.id
								FROM filialdaten_online
								LEFT JOIN filialdaten_quelle 
								ON filialdaten_quelle.verlag_gs  = filialdaten_online.verlag_nr 
								WHERE abfragedatum_id = 258
								AND lieferdatum_id = 56
								AND filialdaten_online.plz LIKE CONCAT(SUBSTR(filialdaten_quelle.plz, -CHAR_LENGTH(filialdaten_quelle.plz), 3), "%") 
								AND filialdaten_online.strasse LIKE CONCAT(SUBSTR(filialdaten_quelle.strasse , -CHAR_LENGTH(filialdaten_quelle.strasse),CHAR_LENGTH(filialdaten_quelle.strasse)- 3), "%") 
								AND filialdaten_online.hausnummer LIKE CONCAT("%", SUBSTR(filialdaten_quelle.hausnummer, -CHAR_LENGTH(filialdaten_quelle.hausnummer), 3), "%") 
								GROUP BY filialdaten_quelle.id having count(filialdaten_online.id) <= 1)
		
		/* Ende des Filterns */
	GROUP BY verlag_nr 

Query 1 gibt mir eine Liste von Falschen Einträgen zurück diese werden dann pro Verlag_Nr zusammen gefasst und gezählt. Dieser Funktionier super. =)

Query 2:

SELECT count(*) AS Doppelt, filialdaten_online.verlag_nr 
	FROM filialdaten_online 
	JOIN filialdaten_quelle 
	ON filialdaten_online.verlag_nr = filialdaten_quelle.verlag_gs 
	
	WHERE produkt_id = 3 
	AND abfragedatum_id = 258
	AND lieferdatum_id = 56
	AND filialdaten_online.plz LIKE CONCAT(SUBSTR(filialdaten_quelle.plz, -CHAR_LENGTH(filialdaten_quelle.plz), 3), "%") 
	AND filialdaten_online.strasse LIKE CONCAT(SUBSTR(filialdaten_quelle.strasse , -CHAR_LENGTH(filialdaten_quelle.strasse),CHAR_LENGTH(filialdaten_quelle.strasse)- 3), "%") 
	AND filialdaten_online.hausnummer LIKE CONCAT("%", SUBSTR(filialdaten_quelle.hausnummer, -CHAR_LENGTH(filialdaten_quelle.hausnummer), 3), "%") 

	
	AND filialdaten_quelle.id IN(SELECT filialdaten_quelle.id
								FROM filialdaten_online
								LEFT JOIN filialdaten_quelle 
								ON filialdaten_quelle.verlag_gs = filialdaten_online.verlag_nr 
								WHERE abfragedatum_id = 258
								AND lieferdatum_id = 56
								AND filialdaten_online.plz LIKE CONCAT(SUBSTR(filialdaten_quelle.plz, -CHAR_LENGTH(filialdaten_quelle.plz), 3), "%") 
								AND filialdaten_online.strasse LIKE CONCAT(SUBSTR(filialdaten_quelle.strasse , -CHAR_LENGTH(filialdaten_quelle.strasse),CHAR_LENGTH(filialdaten_quelle.strasse)- 3), "%") 
								AND filialdaten_online.hausnummer LIKE CONCAT("%", SUBSTR(filialdaten_quelle.hausnummer, -CHAR_LENGTH(filialdaten_quelle.hausnummer), 3), "%") 
								GROUP BY filialdaten_quelle.id having count(filialdaten_online.id) > 1)
	GROUP BY verlag_nr

Query 2 bereitet mir meine Kopfschmerzen , dieser ist kürzer und trotzdem benötigt er eine sehr unangemessene Zeit und ich weiß nicht warum.

Der Hauptunterschied liegt im Subquery das ich im Query1 “<= 1” und im Query2 “> 1” abfrage.
Query 1 hat ansonsten nur noch Prüfabfragen ob eine der Spalten von einem Prüfdatensatz abweicht.

Ich hoffe wirklich ihr könnt mir erklären warum der zweite Query soviel länger braucht und wie ich das beheben kann.

Liebe Grüße
Tilodon

EXPLAIN SELECT …

und DESCRIBE auf den Tabellen.

Die Ausgaben davon könnten weiter helfen.

Hey,

danke für die Antwort, leider bringen mir auch diese Ausgaben nichts. ^^
Leider darf ich diese Angaben auch nicht veröffentlichen, tut mir sehr leid.

Ich habe es jetzt anders gelöst damit dauert die gesamte Abfrage wieder nur 30
Sekunden und damit liegt alles noch im rahmen. =D

Danke trotzdem!!

P.S. Gelöst habe ich es einfach in dem ich die Unterabfrage vorher mache und die ID Liste direkt eintrage in " IN (…) " damit hat MySQL wohl keine Probleme.

LG
Tilodon

warum du keine funktionen baust ist mir auch ein wenig unklar, der code sieht ja soory aber total beschissen aus…Zum anderen wenn du ein Informatiker bist ist diese SQl abfrage total unlogisch und falsch aufgebaut!

sieht nicht unbedingt so aus als würde man sql verstehen sondern hauptsache es funtzt…