2 Spalten mit einen String Abfragen ohne or

splasch

Erfahrenes Mitglied
Problem verwendet man die or klause wird die Abfrage extrem langsam und man könnte meinen die Seite steht.

Code:
SELECT * FROM produkt,bilder,prod_bild,prod_kat where  Bild_id = F_Bildid and Prod_id = prod_bild.F_Prodid and Prod_id =prod_kat.F_Prodid and On_off = 'j'and Prodname like '$begriff' or Artikelnr like '$begriff' group by Prod_id

Diese Abfrage funktioniert zwar aber ist eben extrem Langsam.

Nun hab ich auf der Mysql seite den Vorschlag gefunden das über eine Tempörare Tabelle zu lösen mit 2 Select Abfragen.

Code:
CREATE TEMPORARY TABLE tmp
SELECT * FROM produkt, bilder, prod_bild, prod_kat
WHERE Bild_id = F_Bildid
AND Prod_id =  prod_bild.F_Prodid  
AND Prod_id =  prod_kat.F_Prodid  
AND On_off = 'j'
AND Prodname LIKE '$begriff' 
GROUP BY Prod_id

Nun Tritt aber eine fehler Meldung auf in der Select abfrage:
MySQL meldet:
#1060 - Duplicate column name 'F_Prodid'

Nun stellt sich die Frage wie gibt man in mysql an das es sich dabei um 2 verschiedene Tabellen handelt die den gleichen Spaltennamen haben.
Tabelle prod_bild und Tabelle prod_kat

Hinweis: Die Beschreibung der Temp lösung findet man unter:
http://dev.mysql.com/doc/mysql/de/searching-on-two-keys.html
 
Zuletzt bearbeitet:
Spreche die Felder über Tabellenname.Feldname an und vergebe Aliasnamen:
Code:
SELECT
  Tabelle1.Feldname1 AS Feld11,
  Tabelle1.Feldname2 AS Feld12,
  Tabelle2.Feldname1 AS Feld21,
  Tabelle2.Feldname2 AS Feld22
  # ...
FROM Tabelle1, Tabelle2
# ...
Die Aliasnamen kann man natürlich sinnvoller nennen, als ich das jetzt im Beispiel getan habe. Da ja beide F_Prodid nach Deinem Query gleich sind, genügt es auch, wenn Du nur eine in der Projektion verwendest. Vielleicht brauchst Du sie sogar gar nicht, weil Du ja auch die Prod_id hast.
Mit der expliziten Angabe der Felder holst gegenüber * auch noch ein paar Performancebruchteile raus.

Gruß hpvw
 
Danke für deine Antwort aber das funktioniert leider nicht bei Temporären Tabellen.

Wie man oben aus der Sqlabfrage nehmen kann wurde die Zuweisung mit AND Prod_id = prod_bild.F_Prodid (Spalte=Tabelle2.Splate)durch geführt da es sich hier nur um eine verbindung des Primary Key handelt ist ein as bwz Spaltennamen nicht notwendig.

Anscheinen kann Mysql in Temporären Tabellen keine Tabellen mit . Spalten erkennen. Auch wenn man es in Klammer setz wird es ignoriert.

Genau so geht auch nicht Produkt.prod_id = prod_bild.F_Prodid (Tabelle.spalte = Tabelle2.spalte)

Allerdings funktioniert die zuweisung wenn KEINE Temporäre Tabelle erstellt wird.
 
Zuletzt bearbeitet:
Hi
Problem verwendet man die or klause wird die Abfrage extrem langsam und man könnte meinen die Seite steht.

Code:
SELECT * FROM produkt,bilder,prod_bild,prod_kat where Bild_id = F_Bildid and Prod_id = prod_bild.F_Prodid and Prod_id =prod_kat.F_Prodid and On_off = 'j'and Prodname like '$begriff' or Artikelnr like '$begriff' group by Prod_id

Diese Abfrage funktioniert zwar aber ist eben extrem Langsam.

Liegt das vielleicht daran, dass Du keine Klammern verwendest? Versuch doch mal:

where Bild_id = F_Bildid and Prod_id = prod_bild.F_Prodid and Prod_id =prod_kat.F_Prodid and On_off = 'j'and
( Prodname like '$begriff' or Artikelnr like '$begriff')

voraussgesetzt, das ist das was du meintest.

vop
 
Danke mit den Klammern wird die or Abfrage etwas schneller.

Code:
select count(*) as gefunden from produkt where (Prodname like '$begriff'or Artikelnr like '$begriff')
 
Zuletzt bearbeitet:
Kann die MySQL-Optimierung vielleicht auch besser arbeiten, wenn Du "echte" Joins verwendest?
Code:
SELECT * 
FROM produkt
JOIN prod_kat 
  ON Prod_id = prod_kat.F_Prodid 
JOIN prod_bild
  ON Prod_id = prod_bild.F_Prodid
JOIN bilder
  ON Bild_id = F_Bildid
WHERE On_off = 'j'
  AND (Prodname like '$begriff' 
    OR Artikelnr like '$begriff')
GORUP BY Prod_id
Gruß hpvw
 
Zurück