|
bituniverse.com Entwickler Forum
|
| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
Gast
|
Verfasst am: Fr 14 Mai, 2010 17:56 Titel: myslq QUERY = QUERY |
|
|
Hallo Zusammen,
Ich hab da ein eigenartiges Phänomen.
Ich versuche aus einer Tabelle A Werte zu bekommen,
wenn ein Feldinhalt dieser Tabelle AUCH in einer anderen Tabelle B existiert.
Das klappt auch mit Einschränkungen.
Tabelle A ist erheblich kleiner als Tabelle B.
Nun bekomme ich die Daten aus Tabelle A, die ich will,
allerdings sooft, wie der Vergleichswert sie in Tabelle B existiert.
DAS will ich nicht.
Da ich grundsätzliche Verständnisprobleme habe und mir das WEB nicht wirklich weiter hilft, bin ich am experimentieren
Dabei habe ich folgende Entdeckung gemacht:
Diese beiden Query liefern bezogen auf die Daten die ich will, das gleiche Ergebnis.
Eigentlich wollte ich über Fehlermeldungen der ersten Query weiterkommen, ,
nun funktioniert die, sowas aber auch.
Ich bekomme allerdings immer noch so viele Ergebnisse, wie Datensätze in PTV stehen.
In PTK stehen nur 5. Also sollte die Anzahl der Ergebnisse <=5 sein.
Das Ergebnis ändert sich auch nicht, wenn ich in der zweiten Query LEFT JOIN oder CROSS nutze.
OK, bis auf das value_index, das in der zweiten Query selectiert wird.
Wie kommt das ?
| Code: |
$kindquery="
SELECT PTK.kind_index, PTK.kind_name
FROM pock_turnament_kind AS PTK,
pock_turnament_value AS PTV
WHERE
PTK.kind_index=PTV.turn_kind
";
|
| Code: |
$kindquery="
SELECT PTV.value_index,
PTK.kind_index, PTK.kind_name
FROM pock_turnament_value AS PTV
INNER JOIN
pock_turnament_kind AS PTK
ON PTV.turn_kind=PTK.kind_index
WHERE
PTK.kind_index=PTV.turn_kind
";
|
|
|
| Nach oben |
|
 |
Holger (HMR)
Anmeldedatum: 12.11.2007 Beiträge: 132
|
Verfasst am: Fr 14 Mai, 2010 17:57 Titel: |
|
|
UPS... nicht aufgepasst,
das war mein Beitrag. Sorry.
|
|
| Nach oben |
|
 |
Jens Administrator
Anmeldedatum: 05.11.2007 Beiträge: 193
|
Verfasst am: Sa 15 Mai, 2010 22:04 Titel: |
|
|
Das ist kein eigenartiges Phänomen, sondern die ganz normale Eigenschaft eines Joins. Du legst quasi rechts neben jeden Datensatz aus A alle Datensätze aus B, die das Join-Kriterium erfüllen. Erfüllen mehrere Datensätze aus B das Joinkriterium, dann wird der zugehörige Datensatz aus A halt mehrfach zurück geliefert.
Du wirst jetzt entweder mit GROUP BY arbeiten müssen oder statt des reinen Joins noch ein Subselect einbinden müssen.
Variante A:
| Mysql: |
SELECT
k.kind_index,
k.kind_name
FROM
pock_turnament_kind k
INNER JOIN pock_turnament_value AS v
ON k.kind_index=v.turn_kind
GROUP BY
k.kind_index,
k.kind_name
|
Variante B:
| Mysql: |
SELECT
k.kind_index,
k.kind_name
FROM
pock_turnament_kind k
WHERE
EXISTS(SELECT turn_kind FROM pock_turnament_value v
WHERE k.kind_index=v.turn_kind)
|
So von den Tabellennamen her klingt das ganze so, als ob Du da EAV-Tabellen bastelst. Bist Du Dir sicher, dass das so schlau ist? In vielen Fällen schießt man sich damit nämlich am Ende auch schnell mal in den Fuß...
Gruß Jens
|
|
| Nach oben |
|
 |
Slava Administrator
Anmeldedatum: 16.01.2007 Beiträge: 285 Wohnort: Köln
|
Verfasst am: Di 18 Mai, 2010 14:37 Titel: |
|
|
so lange die werte von der 2-er tabelle nicht bei ergebnis auftauchen würde auch einfacher 'DISTINCT' helfen.
| Mysql: |
SELECT DISTINCT PTK.kind_index, PTK.kind_name
FROM pock_turnament_kind AS PTK,
pock_turnament_value AS PTV
WHERE
PTK.kind_index=PTV.turn_kind
|
|
|
| Nach oben |
|
 |
Holger (HMR)
Anmeldedatum: 12.11.2007 Beiträge: 132
|
Verfasst am: Do 20 Mai, 2010 19:45 Titel: |
|
|
Hallo Jens,
hallo Slava,
vielen Dank für die ausführliche Info.
Ich habe das mit einem GROUP BY gelöst.
Werde das aber auch zwecks Lerneffekt mit
DISTINCTund EXISTS austesten.
Zwei Funktionen, mit denen ich mich noch nie beschäftigt habe,
verwendet vermutlich schon : )
Vielen Dank.
Was ich aber mit Phänomen meine,
ist die für mein Auge extrem unterschiedliche QUERY,
da die erste QUERY OHNE den - JOIN - genauso funktioniert,
in dem ich in der FROM Klause, einfach Tabellen hintereinander hänge.
Nun stelle ich mir die Frage, ist das tatsächlich das Gleiche,
QUERYA=QUERYB
oder sind die Ergebnisse zufällig identisch
und eigentlich tun beide Query etwas anderes.
Lieben Gruß
Holger
|
|
| Nach oben |
|
 |
Holger (HMR)
Anmeldedatum: 12.11.2007 Beiträge: 132
|
Verfasst am: Do 20 Mai, 2010 20:04 Titel: |
|
|
Hallo Jens,
| Zitat: |
So von den Tabellennamen her klingt das ganze so, als ob Du da EAV-Tabellen bastelst. Bist Du Dir sicher, dass das so schlau ist? In vielen Fällen schießt man sich damit nämlich am Ende auch schnell mal in den
Fuß |
ähem.. also, .. ich hab keine Ahnung, ob ich das tue.
Hab mal gegoogelt, hat aber nichts genützt.
ich habe verschiedene Tabellen mit unterschiedlich nutzbarem Inhalte,
der aber auch mal gemeinsam genutzt wird.
Die Tabellen sind von Ihrer Reihenfolge hierarchisch und durch Indizes miteinander verbunden.
Also
- der Index von TABELLE A wird in TABELLE B, ff. verwendet.
- der Index von TABELLE B wird in TABELLE C, ff. verwendet
- der Index Von TABELLE A und TABELLE C wird in TABELLE D verwendete.
In den Querys geht es um Turniere.
Tabellen:
A.- verschiedene Turnier-Arten mit individuellem Eigenschaften
B. - Tabelle mit Turnieren mit Art, Datum, Ort, Uhrzeit (Art kommt von A)
C. - Teilnehmer, aus Tabelle B. und Mitgliederliste
D. - Punkte. Aus Tabelle A, B und Mitgleiderliste
Gruß
Holger
|
|
| Nach oben |
|
 |
Simon W. Anti-verdenglischungs-Abgeordneter
Anmeldedatum: 05.11.2007 Beiträge: 285 Wohnort: Aachen
|
Verfasst am: Sa 22 Mai, 2010 01:01 Titel: |
|
|
| Holger (HMR) hat Folgendes geschrieben: |
| die erste QUERY OHNE den - JOIN - genauso funktioniert, in dem ich in der FROM Klause, einfach Tabellen hintereinander hänge. |
Hi Holger, das ist einfach eine andere Schreibweise für einen normalen join. Die Trennung in ON und WHERE finde ich allerdings schon übersichtlicher.
|
|
| Nach oben |
|
 |
Gast
|
Verfasst am: Sa 22 Mai, 2010 17:06 Titel: |
|
|
ja.
Simon hat richtig bemerkt, dass die Schreibweise mit 'Join' besser ist.
'Join' ist ein Weg, der zeigt wie die Tabellen Verbunden sind und 'Where' ist ein Auswahlkriterium.
Es ist zwar möglich durch Auswahlkriterium 'where' ein Verbund zu erzwingen, aber für die bessere Lesbarkeit muss man doch ein Verbund mit 'JOIN' anwenden.
| Zitat: |
ups,
ich habe vergessen mich anzumelden.
Slava
|
|
|
| Nach oben |
|
 |
Holger (HMR)
Anmeldedatum: 12.11.2007 Beiträge: 132
|
Verfasst am: Fr 28 Mai, 2010 20:05 Titel: |
|
|
DANKE!
das löst mein Problem 
Ich kann aufhören mir das Hirn zu zermartern...
|
|
| Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB2.de
|