[SQL] Problem bei Tabellen-Join
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
anzahl
art
bedingung
code
dank
datensatz
eintrag
ergebnis
gebot
grad
jemand
null
partner
problem
set
tabelle
teil
text
type
-
Hi, Community!
Ich versuche gerade aus einer Tabelle etwas auszulesen und die Anzahl der entsprechenden Einträge in einer anderen Tabelle auch.
So sieht im Moment meine Query aus:
SELECT work__offers.id, work__offers.workid, work__offers.time, COUNT(work__bids.id) FROM work__offers, work__bids WHERE work__offers.active = 1 AND work__bids.offer_id = work__offers.workid
Und so die Tabellen:
DESCRIBE db_133571_1.work__offers; +--------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+----------+------+-----+---------+----------------+ | id | int(200) | NO | PRI | NULL | auto_increment | | workid | int(5) | NO | | NULL | | | active | int(1) | NO | | NULL | | | time | text | NO | | NULL | | +--------+----------+------+-----+---------+----------------+ 4 rows in set (0,00 sec) DESCRIBE db_133571_1.work__bids; +-------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------+------+-----+---------+----------------+ | id | int(200) | NO | PRI | NULL | auto_increment | | offer_id | int(200) | NO | | NULL | | | customer_id | int(200) | NO | | NULL | | | time | text | NO | | NULL | | | value | int(200) | NO | | NULL | | +-------------+----------+------+-----+---------+----------------+ 5 rows in set (0,00 sec)
Und hier das Ergebnis der Query:
SELECT -> work__offers.id, -> work__offers.workid, -> work__offers.time, -> COUNT(work__bids.id) -> FROM -> db_133571_1.work__offers, -> db_133571_1.work__bids -> WHERE -> work__offers.active = 1 AND -> work__bids.offer_id = work__offers.workid; +----+--------+------+----------------------+ | id | workid | time | COUNT(work__bids.id) | +----+--------+------+----------------------+ | NULL | NULL | NULL | 0 | +----+--------+------+----------------------+ 1 row in set (0,00 sec)
Obwohl die Tabelle work__offers einen Datensatz und die Tabelle work__bids keinen enthält, also sollte es eigentlich so aussehen:
SELECT -> work__offers.id, -> work__offers.workid, -> work__offers.time, -> COUNT(work__bids.id) -> FROM -> db_133571_1.work__offers, -> db_133571_1.work__bids -> WHERE -> work__offers.active = 1 AND -> work__bids.offer_id = work__offers.workid; +----+--------+------+----------------------+ | id | workid | time | COUNT(work__bids.id) | +----+--------+------+----------------------+ | 1 | 3 | 1269717267 | 0 | +----+--------+------+----------------------+ 1 row in set (0,00 sec)
Ich hoffe, mir kann jemand helfen.
LG cookies
Beitrag zuletzt geändert: 27.3.2010 20:32:52 von cookies -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Schuld dürfte hier das "work__bids.offer_id = work__offers.workid" sein, weil das unter den Bedingungen eben nicht zutrifft.
Probier mal stattdessen mit richtigen JOINs, evtl. auch mit HAVING rum, das muss irgendwie hinzubekommen sein.
Hab leider grade keine Datenbank mit passenden Inhalten um das zu testen, kann ich mir aber bei Bedarf eine machen... -
Warum machst du keinen Theta Join der beiden Tabellen (im FROM Teil) und holst dir dann im WHERE Teil diejenigen die "aktiv" sind?
Na ja jetzt zu deinem Problem: Wenn die eine Tabelle keine Einträge hat, ist das Ergebnis doch richtig, da es für keinen der Datensätze zutrifft => NULL.
Was mir noch nicht so ganz klar wird, was du mit dem COUNT willst, aber das nur so nebenbei. -
mastersofpuppets schrieb:
Warum machst du keinen Theta Join der beiden Tabellen (im FROM Teil) und holst dir dann im WHERE Teil diejenigen die "aktiv" sind?
Wie geht denn das? Sorry, ich kenn mich mit SQL nicht so gut aus.
mastersofpuppets schrieb:
Na ja jetzt zu deinem Problem: Wenn die eine Tabelle keine Einträge hat, ist das Ergebnis doch richtig, da es für keinen der Datensätze zutrifft => NULL.
Das Problem ist ja grade, dass die Tabelle work__offers einen Datensatz (Eintrag) hat.
mastersofpuppets schrieb:
Was mir noch nicht so ganz klar wird, was du mit dem COUNT willst, aber das nur so nebenbei.
In der Abfrage sollen die ID, die Art und die Erstellungszeit von Jobauktionen und wie viele Gebote schon abgegeben worden sind geholt werden.
LG cookies -
cookies schrieb:
Wie geht denn das? Sorry, ich kenn mich mit SQL nicht so gut aus.
work__offers LEFT [OUTER] JOIN work__bids ON work__bids.offer_id = work__offers.workid
cookies schrieb:
Das Problem ist ja grade, dass die Tabelle work__offers einen Datensatz (Eintrag) hat.
Aber die andere Tabelle hat keinen Eintrag also kann die Bedingung "work__bids.offer_id = work__offers.workid" nicht erfüllt werden, somit bekommst du ein leeres Ergebnis (wird bei dem JOIN nicht anders ablaufen)
cookies schrieb:
In der Abfrage sollen die ID, die Art und die Erstellungszeit von Jobauktionen und wie viele Gebote schon abgegeben worden sind geholt werden.
LG cookies
Dann solltest du noch nach der workID gruppieren (GROUP BY work__bids.offer_id)
Bin mir grad nicht sicher, ob das so sinnvoll ist.
Noch ein paar Sachen für die Zukunft: So wie ich das verstehe, stellt jemand ein "Offer" ein und dann kann man darauf bieten -> work__bids.id ist ein Fremdschlüssel von offer_id.
EDIT: nikic hat natürlich recht, ansonsten fehlen die Angebote ohne Gebote!
Beitrag zuletzt geändert: 27.3.2010 22:20:30 von mastersofpuppets -
Du suchst den LEFT OUTER JOIN. Ein normaler würde dir den Datensatz rauslassen, der LEFT OUTER nimmt ihn auch rein, wenn kein Join-Partner zu finden ist.
-
nikic schrieb:
Du suchst den LEFT OUTER JOIN. Ein normaler würde dir den Datensatz rauslassen, der LEFT OUTER nimmt ihn auch rein, wenn kein Join-Partner zu finden ist.
Danke, genau das wars!
Für alle, dies interessiert:
SELECT work__offers.id, work__offers.workid, work__offers.time, COUNT(work__bids.id) FROM work__offers LEFT OUTER JOIN work__bids ON work__bids.offer_id = work__offers.workid WHERE work__offers.active = 1
Nochmal Danke an nikic und auch mastersofpuppets und theseven!
LG cookies
Edit (djfun): auf Wunsch geschlossen!
Beitrag zuletzt geändert: 27.3.2010 22:25:36 von djfun -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage