26. september 2006 - 21:19Der er
28 kommentarer og 1 løsning
Vis kun rækker hvis data i en anden tabel passer til nogle krav
Hej Eksperter!
Jeg har to avancerede sql-forespørgsler jeg er nødt til at have lidt hjælp til - det er simpelthen langt over mine færdigheder :(
Jeg har disse to tabeller i mit auktionssystem og skal have vist de auktioner brugeren deltager i og som vedkommende enten er vinder i eller har deltaget, men ikke længere er vindende:
CREATE TABLE auktion ( id int(12) NOT NULL auto_increment, `status` int(1) NOT NULL default '1', slut int(12) NOT NULL default '0', PRIMARY KEY (id) ) ENGINE=MyISAM;
CREATE TABLE auktion_bud ( id int(12) NOT NULL auto_increment, auktion int(12) NOT NULL default '0', bruger int(12) NOT NULL default '0', tidspunkt int(12) NOT NULL default '0', bud decimal(12,2) NOT NULL default '0.00', PRIMARY KEY (id) ) ENGINE=MyISAM;
1) Vise auktioner brugeren står til at vinde: Jeg skal vise rækker i auktion hvor der findes en eller flere rækker i auktion_bud hvor auktion_bud.auktion er lig auktion.id og auktion_bud.bruger = [brugerid] og hvor der max er (auktion.antal - 1) rækker i auktion_bud hvor budet er højere end i auktion_bud.bud i de forrige fundne poster.
2) Vise auktioner som brugeren ikke længere står som vinder Jeg skal vise rækker i auktion hvor der findes en eller flere rækker i auktion_bud hvor auktion_bud.auktion er lig auktion.id og auktion_bud.bruger = [brugerid] og der er over auktion.antal bud som er højere en i de forrige fundne rækker.
Håber virkelig nogen forstår hvad jeg vil, og kan hjælpe mig :)
1 select a.id from auktion a inner join auktion_bud b ON a.id=b.auktion where b.bruger=[brugerid] and b.bruger IN (select ab.bruger from auktion_bud ab where ab.auktion=a.auktion limit 1 order by ab.bud desc)
hvis du skriver f.eks select * from auktion a "bliver" a et alias for auktion (nemmere at skrive) prøv at bruge den jeg har skrevet, bare med et ID på en bruger i stedet for [bruger] (byt om på som jeg skrev ;o) ) ~ select a.id from auktion a inner join auktion_bud b ON a.id=b.auktion where b.bruger=[brugerid] and b.bruger IN (select ab.bruger from auktion_bud ab where ab.auktion=a.auktion order by ab.bud desc limit 1)
Ser desværre ikke ud til at virke - Jeg er nødsaget til at sætte lidt php-variabler ind, har jeg gjort det rigtigt? $prefix indeholder noget standard før alle tabelnavne + jeg har indsat auktion.status = 2
SELECT a.* FROM {$prefix}auktion a inner join {$prefix}auktion_bud b ON a.id=b.auktion where b.bruger=$brugerid and b.bruger IN (select ab.bruger from {$prefix}auktion_bud ab where ab.auktion=a.auktion order by ab.bud desc limit 1) AND {$prefix}auktion.status = 2 GROUP BY {$prefix}auktion.id ORDER BY {$prefix}auktion.slut ASC
dit seneste eksempel er egentlig skide smart, har jeg kunne bruge ofte i stedet for at skulle lave det over to forespørgsler, men det er os lidt simplere end mit nuværende problem? ;S
prøv --- SELECT a.* FROM {$prefix}auktion a inner join {$prefix}auktion_bud b ON a.id=b.auktion where b.bruger=$brugerid and b.bruger IN (select ab.bruger from {$prefix}auktion_bud ab where ab.auktion=a.auktion order by ab.bud desc limit 1) AND a.status = 2 GROUP BY a.id ORDER BY a.slut ASC --- du vil have alle som er status=2 går jeg udfra, og sorteret efter hvornår de slutter
du giver dine tabeller aliaser a~{$prefix}auktion, b~{$prefix}bud og ab~{$prefix}bud ("alias 2")
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 '(a.antal-1)) AND a.status = 2 GROUP BY a.id ORDER BY a.slut ASC LIMIT 0,30' at line 1
SELECT a.* FROM {$prefix}auktion a inner join {$prefix}auktion_bud b ON a.id=b.auktion where b.bruger=$brugerid and b.bruger IN (select ab.bruger from {$prefix}auktion_bud ab where ab.auktion=a.id order by ab.bud desc limit (a.antal-1)) AND a.status = 2 GROUP BY a.id ORDER BY a.slut ASC
det er meget muligt at du kan lave det på andre måder
min sql viser (burde vise) kun hvilke auktioner som $brugerid vil vinde, ikke alle hans bud eller de auktioner han ikke vinder. (det var kun spm 1 jeg tænkte på)
min subquery select ab.bruger from {$prefix}auktion_bud ab where ab.auktion=a.auktion order by ab.bud desc limit 1 svarer til noget ala select ab.bruger from {$prefix}auktion_bud ab where ab.auktion=1 where bruger=$brugerid order by ab.bud desc limit 1 (hvor "ab.auktion=1" er auktionen med id 1)
ved ikke om jeg har forstået dig korrekt (eller om du har forstået mig) men det er fordi det _kan_ være en multiauktion hvor der fx er sat 5 ens produkter til salg, så er der mulighed for der er 5 vindende bud til én auktion. men det er rigtigt som du skriver at det kun skal være de auktioner brugeren står til at vinde...
det sidste forstod jeg ikke, men ab.auktion=a.auktion, skal vel være ab.auktion=a.id ?
men.. select distinct a.id, ab.bruger from {$prefix}auktion_bud ab inner join auktion a ON ab.auktion=a.id where a.status=2 order by ab.bud desc limit 5
select distinct a.id, ab.bruger from {$prefix}auktion_bud ab inner join {$prefix}auktion a ON ab.auktion=a.id where a.status=2 order by ab.bud desc limit 5
(måske det er fordi; jeg har bare kopieret noget af det jeg skrev tidligere, i min "IN" var det ab som alias for auktion_bud, i "hovedsætningen" var det bare b)
men i ovenstående kan EN bruger kun vinde EN auktion (kan ikke købe 2 produkter, fra samme auktion) evt. uden distinct?? select a.id, ab.bruger from {$prefix}auktion_bud ab inner join {$prefix}auktion a ON ab.auktion=a.id where a.status=2 order by ab.bud desc limit 5 (jeg "gætter" lidt nu)
men så er der 5 produkter i hver auktion.. denne kunne evt. virke (limit er sat til auktion.antalvarer), men det ved jeg ikke om man kan i mysql....
select a.id, ab.bruger from {$prefix}auktion_bud ab inner join {$prefix}auktion a ON ab.auktion=a.id where a.status=2 order by ab.bud desc limit a.antalvarer
hvis det ikke virker kan du evt dele det op (er ikke php'er) ala
først..
$sql ="select id, antalvarer from auktion where status=2"
for (i=1; i++; antalvarer(fra sql før) ) { $sql2 = "select ab.bruger from {$prefix}auktion_bud ab inner join {$prefix}auktion a ON ab.auktion=a.id where a.id=antalvarer(fra sql før) order by ab.bud desc " while Read(stadig er records) { $print sql2(ab.bruger) } }
$sql ="select id, antalvarer from auktion where status=2"
for (i=1; i++; antalvarer(fra sql før) ) { $sql2 = "select ab.bruger from {$prefix}auktion_bud ab inner join {$prefix}auktion a ON ab.auktion=a.id where a.id=id(fra sql før) <<<<------- order by ab.bud desc " while Read(stadig er records) { $print sql2(ab.bruger) } }
jeg har lavet en ekstra tabel som rummer brugerid og auktionsid på de bud der har vundet
har så lavet mine sql på følgende måde:
if ($type == "aktive") $sql = "SELECT a.* FROM {$prefix}auktion a INNER JOIN {$prefix}auktion_bud ab ON a.id = ab.auktion AND ab.bruger = '$brugerid' WHERE a.status = 2 AND a.slut > $fra AND a.slut > $phptime GROUP BY a.id ORDER BY a.slut ASC";
if ($type == "overbudt")$sql = "SELECT a.* FROM {$prefix}auktion a INNER JOIN {$prefix}auktion_bud ab ON a.id = ab.auktion AND ab.bruger = '$brugerid' INNER JOIN {$prefix}auktion_bud_vinder abv ON a.id = abv.auktion WHERE a.status = 2 AND abv.bruger != '$brugerid' AND a.slut > $fra AND a.slut > $phptime GROUP BY a.id ORDER BY a.slut ASC";
if ($type == "vinder") $sql = "SELECT a.* FROM {$prefix}auktion a INNER JOIN {$prefix}auktion_bud ab ON a.id = ab.auktion AND ab.bruger = '$brugerid' INNER JOIN {$prefix}auktion_bud_vinder abv ON a.id = abv.auktion WHERE a.status = 2 AND abv.bruger = '$brugerid' AND a.slut > $fra AND a.slut > $phptime GROUP BY a.id ORDER BY a.slut ASC";
Men jeg har problemer med typen 'overbudt', her skal man kun listes hvis man _slet_ ingen bud har i auktion_bud_vinder, hvilket ikke sker nu, hvis man har et bud i og andre også har et bud bliver man listet i både 'overbudt' og 'vinder'. Hvordan undgår jeg det?
lukker nu, skriv hvis du gerne vil have pointene :)
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.