Avatar billede elskermad.dk Nybegynder
26. september 2006 - 21:19 Der 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 :)

På forhånd tak!
Avatar billede a1a1 Novice
26. september 2006 - 21:45 #1
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)

???

er det noget du kan bruge

;o)
Avatar billede a1a1 Novice
26. september 2006 - 21:47 #2
der skal vist byttes om på limit 1 og order by ab.bud desc ;o)
Avatar billede elskermad.dk Nybegynder
26. september 2006 - 21:52 #3
huha jeg er stået helt af når det kommer ind i join, jeg kan ikke engang se om jeg skal udskrive a med auktion nogen steder?

kan jeg få dig til at skrive den helt ud og på en linie, så prøver jeg lige at sætte den ind? :)
Avatar billede a1a1 Novice
26. september 2006 - 22:03 #4
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)

;o)
Avatar billede a1a1 Novice
26. september 2006 - 22:10 #5
hvis du har en tabel med f.eks.:
id og parentId (parentId er "under" id, ala et treeview) vil du kunne gøre noget ala:

select a.id, b.id from table1 a left join table1 b ON a.id=b.parentId
where a.id=1

og dermed få øversteniveau, og dem under (hvis b.id er = NULL er det øversteniveau

jeg er ikke særlig pædagogisk ;o), men kan også godt lide mad :o)
Avatar billede a1a1 Novice
26. september 2006 - 22:11 #6
(meningen med ovenstående er at table1 a og table1 b opfattes som 2 forskellige tabeller af serveren)
Avatar billede elskermad.dk Nybegynder
26. september 2006 - 22:14 #7
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
Avatar billede elskermad.dk Nybegynder
26. september 2006 - 22:16 #8
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
Avatar billede a1a1 Novice
26. september 2006 - 22:44 #9
opretter du en ny tabel for hver auktion?

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")
Avatar billede elskermad.dk Nybegynder
26. september 2006 - 22:50 #10
nej alle mine auktioner findes i {$prefix}auktion og deres id bliver så nævnt som auktion i {$prefix}auktion_bud

prøver lige at indsætte din, limit skal ikke være 1, men {$prefix}auktion.antal - 1
Avatar billede elskermad.dk Nybegynder
26. september 2006 - 22:53 #11
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
Avatar billede elskermad.dk Nybegynder
26. september 2006 - 22:56 #12
Hvis jeg ændre din limit om til limit 1 igen får jeg denne fejl:

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

Bruger version 4.1.21-standard
Avatar billede a1a1 Novice
26. september 2006 - 23:11 #13
limit skal være 1 (du vil have DET højeste bud hvor bruger=brugeren i en given auktion, ikke 30)

men....

det er (vist) først fra version 5 at mysql understøtter subqueries...(det i parentesen efter IN)

:(

hvis du kan så prøv at opgrader din mySql server (det er nemt på windows men, du bruger sikkert "det andet" ;o) )

;o)
Avatar billede elskermad.dk Nybegynder
26. september 2006 - 23:24 #14
ja jeg bruger wannafind så kan ikke rigtig få det opgraderet ;( vil det sige det ikke kan lade sig gøre?

ehmn, der kan godt være en række "høje nok" bud - det antal kan ses i auktion.antal
Avatar billede a1a1 Novice
26. september 2006 - 23:37 #15
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)
Avatar billede elskermad.dk Nybegynder
26. september 2006 - 23:48 #16
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 ?
Avatar billede a1a1 Novice
27. september 2006 - 00:00 #17
der er ikke et alias der hedder a i den sidste ;o)

den sidste vil give dig vinderen i EN auktion, jeg var ikke klar over at der kunne være flere produkter pr. auktion

men ellers 5 forkellige brugeres højeste bud (på auktion 1)

select distinct ab.bruger from {$prefix}auktion_bud ab where ab.auktion=1
order by ab.bud desc limit 5

måske denne: ?

select distinct 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
Avatar billede a1a1 Novice
27. september 2006 - 00:01 #18
(den sidste dur nok ikke)
Avatar billede a1a1 Novice
27. september 2006 - 00:02 #19
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
Avatar billede elskermad.dk Nybegynder
27. september 2006 - 00:09 #20
den sidste du har skrevet 02:35, er stadig den der skal være inde i IN'en ikk? altså den jeg skal bruge mysql 5 til?
Avatar billede elskermad.dk Nybegynder
27. september 2006 - 00:12 #21
men huha jeg synes det er svært at gennemskue...

kan se jeg ikke har fået antal med i min "create table" - det beklager jeg, men der angives det hvormange vindende bud der er for hver auktion.
Avatar billede a1a1 Novice
27. september 2006 - 00:14 #22
nej, men skulle være....(manger prefix)

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)
Avatar billede a1a1 Novice
27. september 2006 - 00:20 #23
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)

;o)
Avatar billede a1a1 Novice
27. september 2006 - 00:23 #24
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
Avatar billede a1a1 Novice
27. september 2006 - 00:33 #25
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)
}
}

jeg ved ikke om det er helt sort ;o)
Avatar billede a1a1 Novice
27. september 2006 - 00:54 #26
ups....(du skal bruge id ikke antalvarer)

$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)
}
}
Avatar billede elskermad.dk Nybegynder
28. september 2006 - 15:53 #27
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?
Avatar billede elskermad.dk Nybegynder
09. januar 2007 - 19:46 #28
smider du et svar A1? Beklager jeg ikke har fået fulgt op på dette
Avatar billede elskermad.dk Nybegynder
13. januar 2007 - 15:42 #29
lukker nu, skriv hvis du gerne vil have pointene :)
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