phpbar.de logo

Mailinglisten-Archive

left join und where-Bedingung
Archiv Mailingliste mysql-de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

left join und where-Bedingung



hi,

ich habe mal wieder ein Problem.

Was passiert mit der Where-Bedingung nach einem left outer join?
Situation:
Ich habe drei Tabellen
a) Seminarbeschreibungen (katalog)
b) Seminarart (daten)
c) idx (Eine Index-Tabelle mit Schlüsselworten)
diese enthält das Schüsselwort und dazu die id aus der katalog.tabelle.

Ziel: eine quasi Suchmaschinen-abfrage
(Die Daten aus seminarart müssen drangejoint werden.)
Sobald man mehrere Suchbedingungen mit AND verknüpft, läuft sie einwandfrei.
Problem:
Bei einer OR-Verknüpfung kommen unsinnige Resultate raus (viel zu groß)
Folgende Abfrage liefert 1900 Einträge.
Sucht man nach den Wörtern allein, dann sind es jeweils 5 Einträge.

SELECT DISTINCT
 k.id as id,
 k.kat_titel as kat_titel,
 k.ms_titel as kategorie,
 k.b_gliednr as gliednr,
 k.sem_text as semtxt,
 a.semart_id as said,
 a.anz_tage as s_dauer

FROM
 idx as idx ,
 katalog as k left outer join seminarart as a ON k.b_kuerzel=a.semart_id

WHERE k.id = idx.id
 AND idx.keyword LIKE 'Absicherung%'
 OR idx.keyword LIKE 'Ablauf%'

mit EXPLAIN kommt folgendes:
+------+------+----------------+-----+---------+-----+------+------------+
|table | type |  possible_keys | key | key_len | ref | rows | Extra      |
+------+------+----------------+-----+---------+-----+------+------------+
| k    |  ALL |      PRIMARY   |     |         |     |  379 |            |
+------+------+----------------+-----+---------+-----+------+------------+
| idx  |  ALL |      id        |     |         |     | 7064 |where used  |
+------+------+----------------+-----+---------+-----+------+------------+
| a    |  ALL |      PRIMARY   |     |         |     | 1162 |            |
+------+------+----------------+-----+---------+-----+------+------------+

bei nur einem Suchwort(die OR-Zeile weggelassen):
+------+------+----------------+-----+---------+-----+------+------------+
|table |type  |possible_keys   |key  | key_len | ref | rows |   Extra    |
+------+------+----------------+-----+---------+-----+------+------------+
| k    | ALL  | PRIMARY        |     |         |     |  379 |            |
+------+------+----------------+-----+---------+-----+------+------------+
| idx  | ref  |    id          | id  |     4   | k.id|  19  | where used |
+------+------+----------------+-----+---------+-----+------+------------+
| a    | ALL  |   PRIMARY      |     |         |     | 1162 |            |
+------+------+----------------+-----+---------+-----+------+------------+

(die Tabellen sind ASCII-Code, sieht im OE leider blöd aus)
Ich dachte immer, dass über Kreuzprodukt eine Art Zwischentabelle erstellt
wird, aus der dann die überflüssigen Ergebnisse, die also nicht den
Bedingungen in der WHERE-Clause entsprechen, gestrichen werden.
Aber irgendwie ist das hier anders, oder?
Hat jemand eine Idee, woran das liegen könnte?
danke!

br | rb


---
*** Abmelden von dieser Mailingliste funktioniert per E-Mail
*** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe


Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive