[MySQL] Sub-query geeft onverwacht resultaat

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • _Jeffrey_
  • Registratie: Maart 2003
  • Niet online
Ik ben bezig met het maken van een script voor een veiling site.
Veilingen staan in de tabel 'auctions'. Biedingen staan in de table 'bids'.
Het is mogelijk meerdere items per veiling te veilen (bv. 3 objecten van hetzelfde type). Ook is bij een veiling in te stellen dat deze automatisch opnieuw geveild wordt als er niet het minimumbod geboden is.

Om deze 'sub veilingen' in de database te structureren heb ik een veld genaamd nth_subauction in de tabel bids om aan te geven aan welke sub veiling deze bieding gekoppeld is.

Ik wil nu alle veilingen uit de database selecteren waar nog op geboden kan worden. Het lukt mij echter niet om het gewenste resultaat te bereiken. Ik heb nu de volgende query:

code:
1
2
3
4
5
6
7
8
9
10
11
12
    $result = query("
    SELECT *
        FROM auctions 
        WHERE status = 'active' AND 
        (SELECT count(*)
            FROM bids WHERE 
                bids.`item-id` = auctions.id) 
            GROUP BY bids.nth_subauction) < num_items AND
            " . time() . " > start_time 
            AND ((" . time() . " < (start_time + (run_time * num_items))) 
                OR (try_again = '1' AND num_sold < num_items)) 
        ORDER BY (start_time + (CEILING((" . time() . " - start_time) / run_time) * run_time)) ASC LIMIT " . $items_per_page_index);


Wat ik met de sub-query wil bereiken is dat het aantal unieke sub-veiling items wordt geteld waar op is geboden. Alleen als deze waarde kleiner is dan num_items (het aantal objecten van dit type beschikbaar) mag de veiling getoont worden.
Ik krijg echter 0 resultaten, terwijl er echt veilingen zijn welke aan de criteria voldoen.

Wat doe ik fout?

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Als je geen directe relatie tussen biedingen en een object hebt waar op geboden is, dan wordt het best lastig om goed te doen.

Weet je zeker dat je query uberhaupt correct is? Want volgens mij heb je twee haakjes sluiten bij je subselect... Het werkt in dit soort gevallen over het algemeen het beste om de query niet gelijk in code op te nemen, maar eerst in een sql-tool (bijv phpmyadmin) te testen zodat je eenvoudig dingen kan aanpassen en/of stukken kan weglaten.

Maar sowieso lijkt me dat je sub-query zo uberhaupt fout is, want als er meerdere nth_subauctions zijn, dan krijg je meerdere resultaten door die group by en uiteindelijk een query-error (of wellicht dat mysql dat anders oplost).
Het lijkt me dat je eerder zoiets moet doen:
SQL:
1
2
3
(SELECT count(distinct bids.nth_subauction)
            FROM bids WHERE 
                bids.`item-id` = auctions.id) < num_items


Overigens, als je al een num_sold bijhoudt, waar is dan die subquery uberhaupt voor nodig?? Zolang er niets verkocht wordt zou de veiling toch oneindig lang herhaald mogen worden?

Acties:
  • 0 Henk 'm!

  • _Jeffrey_
  • Registratie: Maart 2003
  • Niet online
Hij werkt! :)
DISTINCT was de truuk (en GROUP BY weg)... idd logisch dat er meerdere resultaten zijn met group by, en dat dat niet gaat werken.

Dat er een haakje teveel staat in mijn geplaatste code klopt... Ik had een irrelevant gedeelte van de query er uit gehaald, maar blijkbaar een haakje laten staan.


Mijn dank is groot :)