16. oktober 2011 - 19:25Der er
14 kommentarer og 1 løsning
Hjælp med database forspørgsler
Jeg er ved at lave et online auktionssystem til et fysisk auktionshus og har to spørgsmål
1. Jeg har en tabel der admninistrerer budene. Det er en "index" tabel for to andre, brugere og varer. I denne tabel registrerer jeg hvilke varer der er budt på til hvilken pris og af hvem.
Jeg vil gerne trække ud af denne tabel de bud som kunden har, men kun dem hvor buddet er højest. Har kunden budt 3 gange på en vare, skal det kun være det højeste bud der kommer frem.
Hvad gør jeg?
Har følgende kolonner: id, kunde_id, vare_id, pris
2. I samme system skal jeg bruge at muligheden for at byde forsvinder dagen før auktionen skal afholdes. Problemet er at jeg skal finde ud af det under en vare, og datoen for auktionen er i en anden tabel.
Jeg har altså en tabel med varer, som refererer til en tabel med auktionerne.
Er jeg nødt til først at lave et databasekald hvor jeg spørger på hvilket auktionsid varen hører til, og herefter slå den auktion op i databasen over auktioner, hvor jeg så får datoen? - eller kan det gøres i et kald?
1. Du får lige de rigtige navne for kunne ikke få det til at virke Database: aas_user_bid_index Bruger id:user_id Vare id:catalog_id Bud pris:price
SELECT * FROM aas_user_bid_index INNER JOIN (SELECT MAX(id) as [id] from aas_user_bid_index GROUP BY catalog_id) AS t2 ON aas_user_bid_index.id = t2.id
2. Prøver at gøre det mere tydeligt Jeg bruge muligheden for at byde på en vare forsvinder dagen før auktionen skal afholdes. Problemet er at jeg skal finde ud af det et sted hvor jeg kun har varenr, ikke auktionsnr, derfor er datoen for auktionen er i en anden tabel.
Jeg har altså en tabel med varer, som refererer til en tabel med auktionerne.
Er jeg nødt til først at lave et databasekald hvor jeg spørger på hvilket auktionsid varen hører til, og herefter slå den auktion op i databasen over auktioner, hvor jeg så får datoen? - eller kan det gøres i et kald?
SELECT * FROM aas_user_bid_index INNER JOIN (SELECT MAX(id) as [id] from aas_user_bid_index GROUP BY catalog_id) AS t2 ON aas_user_bid_index.id = t2.id
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[ id ] from aas_user_bid_index GROUP BY catalog_id ) AS t2 ON aas_user_bid_index' at line 1
skal bare have hjælp til at rette sql strengen til!
Eller simplere. Det vil sige hvis jeg har forstået spørgsmål 1 korrekt. For hver kombination af kunde og vare vil have det højeste bid. Hvis kunde1 har budt 10kr, 11kr, og 12kr på vare1 og har budt 13kr på vare2 og hvis kunde2 har budt 14kr og 15kr på vare1, så vil du have det følgende:
kunde vare pris 1 1 12 1 2 13 2 1 15
I så fald kan du få det med denne query:
SELECT user_id, catalog_id, max(price) FROM aas_user_bid_index GROUP BY user_id, catalog_id
@Christian_Belgien ja, det er næsten 100% rigtigt. det eneste der er at jeg skal sætte brugerens id ind, så jeg kun får det fra den ene bruger! Men tak for svar! så skal lave en WHERE user_id = $_STRENG et sted.. men hvor? ;-)
Ny lyder det som om det i virkeligheden er et php spørgsmål og du kalder mysql databasen fra php. Er det tilfældet? Hvis ja, hvordan ved du så hvilken user du er interesseret i? Står det i en variabel $_STRENG? I så fald bliver det sådan noget som:
<?php ..... $result = mysql_query("SELECT user_id, catalog_id, max(price) FROM aas_user_bid_index GROUP BY user_id, catalog_id WHERE user_id = $_STRING"); ?>
Jeg går lige et skridt videre end dit spørgsmål 2. Jeg går ud fra at du har (eller jeg vil stærkt anbefale at du får) en tabel med varer hvor du du registrerer det der er nødvendigt for at beskrive en vare, for eksempel:
Vare id betegnelse tilstand kategori ejer 1 cykelhjul som ny reservedele hansen 2 flagstang slidt udstyr jensen
og en tabel over auktioner Auktion id dato sted leder 1 15-10 huset kaj 2 16-10 stalden ole
og så en tabel der viser hvilke varer der er på hvilke auktioner:
Hvis du så vil have de varer der ikke kan bydes på, så kan du finde dem således:
SELECT vare_id FROM vare_auktion va JOIN Auktion a ON va.auktion_id = a.id WHERE DATEDIF(a.dato, DATE(NOW())) <= 1
Lidt forklaring: Funktionen NOW() giver den nuværende dato og tid. DATE(NOW()) giver dato delen af denne dato-tid. DATEDIF(x, y) trækker y fra x, i mit eksempel trækker dagen idag fra auktionsdagen.
når jeg bruger: mysql_query("SELECT user_id, catalog_id, max(price) FROM aas_user_bid_index GROUP BY user_id, catalog_id WHERE user_id = 1") or die(mysql_error());
får jeg følgende fejlkode: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE user_id = 1' at line 1
En af mine brugere hedder 1, så istedet for strengen skriver jeg bare det til test.
Fjerner jeg where user, så vises price ikke længere, samt de fleste kommer frem igen. Kan det være de skal sorteres eller noget før max?
Det gjorde jeg med vilje for at se hvor vaks du var (nej det var en tanketorsk, fordi det er ved at være sengetid i Belgien, beklager, og godt du fandt ud af det.)
Jeg opretter dette som svar jeg håber du vil acceptere, idet jeg mener jeg har bidraget til at løse dit spørgsmål.
Det ved jeg godt Christian, det var mere at du igen skrev MySQL :-)
De burde også snart tage sig sammen og gøre ting på den samme måde. Hvor er det bare mega plat ikke at kunne bruge de samme ting på alle version af en SQL server.
mvh
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.