bituniverse.com Foren-Übersicht bituniverse.com
Entwickler Forum
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

myslq QUERY = QUERY

 
Neues Thema eröffnen   Neue Antwort erstellen    bituniverse.com Foren-Übersicht -> Datenbanken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Gast






BeitragVerfasst am: Fr 14 Mai, 2010 17:56    Titel: myslq QUERY = QUERY Antworten mit Zitat

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 Cool
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, Laughing ,
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:
  1.        $kindquery="
  2.             SELECT PTK.kind_index, PTK.kind_name
  3.             FROM pock_turnament_kind AS PTK,
  4.                  pock_turnament_value AS PTV
  5.             WHERE
  6.                 PTK.kind_index=PTV.turn_kind                            
  7.         ";

Code:
  1.        $kindquery="
  2.             SELECT PTV.value_index,
  3.             PTK.kind_index, PTK.kind_name
  4.  
  5.             FROM pock_turnament_value AS PTV
  6.             INNER JOIN
  7.                 pock_turnament_kind AS PTK
  8.                 ON PTV.turn_kind=PTK.kind_index
  9.             WHERE
  10.                 PTK.kind_index=PTV.turn_kind                            
  11.         ";
  12.  

Nach oben
Holger (HMR)



Anmeldedatum: 12.11.2007
Beiträge: 132

BeitragVerfasst am: Fr 14 Mai, 2010 17:57    Titel: Antworten mit Zitat

UPS... nicht aufgepasst,
das war mein Beitrag. Sorry.

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jens
Administrator


Anmeldedatum: 05.11.2007
Beiträge: 193

BeitragVerfasst am: Sa 15 Mai, 2010 22:04    Titel: Antworten mit Zitat

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:
  1. SELECT
  2.   k.kind_index,
  3.   k.kind_name
  4. FROM
  5.   pock_turnament_kind k
  6.     INNER JOIN pock_turnament_value AS v
  7.       ON k.kind_index=v.turn_kind
  8. GROUP BY
  9.   k.kind_index,
  10.   k.kind_name

Variante B:

Mysql:
  1. SELECT
  2.   k.kind_index,
  3.   k.kind_name
  4. FROM
  5.   pock_turnament_kind k
  6. WHERE
  7.   EXISTS(SELECT turn_kind FROM pock_turnament_value v
  8.          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
Benutzer-Profile anzeigen Private Nachricht senden
Slava
Administrator


Anmeldedatum: 16.01.2007
Beiträge: 285
Wohnort: Köln

BeitragVerfasst am: Di 18 Mai, 2010 14:37    Titel: Antworten mit Zitat

so lange die werte von der 2-er tabelle nicht bei ergebnis auftauchen würde auch einfacher 'DISTINCT' helfen.

Mysql:
  1. SELECT DISTINCT PTK.kind_index, PTK.kind_name
  2.             FROM pock_turnament_kind AS PTK,
  3.                  pock_turnament_value AS PTV
  4.             WHERE
  5.                 PTK.kind_index=PTV.turn_kind

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Holger (HMR)



Anmeldedatum: 12.11.2007
Beiträge: 132

BeitragVerfasst am: Do 20 Mai, 2010 19:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Holger (HMR)



Anmeldedatum: 12.11.2007
Beiträge: 132

BeitragVerfasst am: Do 20 Mai, 2010 20:04    Titel: Antworten mit Zitat

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. Embarassed
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
Benutzer-Profile anzeigen Private Nachricht senden
Simon W.
Anti-verdenglischungs-Abgeordneter


Anmeldedatum: 05.11.2007
Beiträge: 285
Wohnort: Aachen

BeitragVerfasst am: Sa 22 Mai, 2010 01:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Gast






BeitragVerfasst am: Sa 22 Mai, 2010 17:06    Titel: Antworten mit Zitat

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

BeitragVerfasst am: Fr 28 Mai, 2010 20:05    Titel: Antworten mit Zitat

DANKE!

das löst mein Problem Smile
Ich kann aufhören mir das Hirn zu zermartern...

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    bituniverse.com Foren-Übersicht -> Datenbanken Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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
Powered by WebRing.