kostenloser Webspace werbefrei: lima-city


[SQL] Problem bei Tabellen-Join

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    cookies

    Kostenloser Webspace von cookies

    cookies hat kostenlosen Webspace.

    Hi, Community! :wave:

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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...
  4. mastersofpuppets

    mastersofpuppets hat kostenlosen Webspace.

    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.
  5. Autor dieses Themas

    cookies

    Kostenloser Webspace von cookies

    cookies hat kostenlosen Webspace.

    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
  6. mastersofpuppets

    mastersofpuppets hat kostenlosen Webspace.

    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
  7. 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.
  8. Autor dieses Themas

    cookies

    Kostenloser Webspace von cookies

    cookies hat kostenlosen Webspace.

    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! :thumb:

    LG cookies

    Edit (djfun): auf Wunsch geschlossen!

    Beitrag zuletzt geändert: 27.3.2010 22:25:36 von djfun
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!