Avatar billede sfollmann Nybegynder
16. oktober 2011 - 19:25 Der 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?
Avatar billede Syska Mester
16. oktober 2011 - 19:48 #1
1)

SELECT * FROM t1
INNER JOIN (
SELECT MAX(id) as [id] from t1 GROUP BY vare_id
) AS t2 ON t1.id = t2.id

Dette burde gerne give dig alle vare sammen med dem som har det højeste bud.

2)
Det spm forstår jeg ikke ... for mange fejl i. Kan du eventuelt prøve at formulere det igen?
Avatar billede sfollmann Nybegynder
16. oktober 2011 - 20:43 #2
Tak!

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?
Avatar billede Syska Mester
16. oktober 2011 - 21:00 #3
1.
Hvad virker ikke. Hvad får du tilbage som ikke er det rigtige ?

2.
Jeg er stadig helt tabt, men måske en anden kan gennemskue det.

mvh
Avatar billede sfollmann Nybegynder
16. oktober 2011 - 21:11 #4
2. :-)

1. Når jeg kører:

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!
16. oktober 2011 - 21:12 #5
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

Jeg kikker på og vender tilbage til spørgsmål 2.
16. oktober 2011 - 21:25 #6
Jeg så ikke #4 før jeg sendte #5.  Har du prøvet #5?  Jeg ville have tilføjet to ting:

a.  Hvis du vil have det for en bestemt kunde, for eksempel med user_id = 1, får du det ved at tilføje 'WHERE user_id = 1'

b.  Hvis du gerne vil have kundernes navn i stedet for blot user_id må du joine den tabel hvor kundernes navn er, lad os kalde den Kunde:

SELECT k.navn, catalog_id, max(price) FROM aas_user_bid a JOIN Kunde k ON a.user_id = k.id

og hvis du også vil have varens navn, hvis det sidder i tabellen Catalog, bliver det til:

SELECT k.navn, c.navn, max(price) FROM aas_user_bid a JOIN Kunde k ON a.user_id = k.id JOIN Catalog c ON a.catalog_id = c.id
Avatar billede sfollmann Nybegynder
16. oktober 2011 - 21:27 #7
@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? ;-)
16. oktober 2011 - 21:50 #8
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 er ved at kikke på spørgsmål 2.)
16. oktober 2011 - 22:05 #9
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:

Vare_auktion
id vare_id auktion_id
1    15          3
2    17          3
3    22          4

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.
Avatar billede sfollmann Nybegynder
16. oktober 2011 - 22:10 #10
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?
Avatar billede sfollmann Nybegynder
16. oktober 2011 - 22:20 #11
where skulle bare flyttes ind SELECT *, max(price) FROM aas_user_bid_index where user_id = 1  group by user_id, catalog_id order by catalog_id
16. oktober 2011 - 23:01 #12
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.
Avatar billede Syska Mester
16. oktober 2011 - 23:26 #13
#Christian_Belgien

Elsker at du altid blander mssql og mysql :-)

Ved faktisk ikke helt hvad han bruger, men mon ikke mssql når det er oprettet i mssql :-)


#sfollmann
1)
Ville du ikke kun have de bud på en vare hvor det var brugeren selv der havde højeste bud?
17. oktober 2011 - 07:40 #14
buzzzz, ups igen.  Men den sql kode jeg foreslår er vist den samme i mysql og mssql.
Avatar billede Syska Mester
17. oktober 2011 - 09:36 #15
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester