webForumDet fria alternativet

Budgivning

23 svar · 561 visningar · startad av Marcus E

Marcus EMedlem sedan maj 20021 466 inlägg
#1

SQL är svårt att förstå för mig. Därför behöver jag lite hjälp med ett problem som jag har.

Jag har en tabell Products med ID och Name. Vidare har jag en tabell Bids med ID, ProductID, UserID, Bid.

Products innehåller produkterna man kan bjuda på och Bids innehåller buden. Hur kan jag plocka ut samtliga produkter med eventuellt bud och samtidigt få maxbudet?

Denna SQL-sats ska alltså även filtrera ut alla bud under maxbudet.
SELECT Products.Name, Products.ID, Bids.Bid
FROM (Products LEFT OUTER JOIN
Bids ON Products.ID = Bids.ProductID)

Tack på förhand.

PeeerMedlem sedan mars 20025 907 inlägg
#2
select p.name, p.id, max(bid) as maxbid from products as p
left outer join bids as b on b.productid = p.id
group by p.id
Marcus EMedlem sedan maj 20021 466 inlägg
#3

Tack. Fast det funkar inte.

"You tried to execute a query that does not include the specified expression 'name' as part of an aggregate function."

Tydligen kan mna lösa det genom att lägga till p.name sist. Finns det inget annat sätt?

PeeerMedlem sedan mars 20025 907 inlägg
#4

Använder du access så får du byta 'name' mot något annat då det är ett reserverat ord.

Källa

Marcus E skrev:

Tydligen kan mna lösa det genom att lägga till p.name sist. Finns det inget annat sätt?

Lägga sist? Hur menar du nu?

Marcus EMedlem sedan maj 20021 466 inlägg
#5

name kallar jag för något annat så det är inget problem.

Med lägga till sist menar jag:
select p.name, p.id, max(bid) as maxbid from products as p
left outer join bids as b on b.productid = p.id
group by p.id, p.name

Marcus EMedlem sedan maj 20021 466 inlägg
#6

Fanns det något sätt att inte behöva GROUP BY för alla kolumner?

Engine^Medlem sedan dec. 20003 887 inlägg
#7

Tja... genom att köra MySQL... men det är inte SQL-standard.

Marcus EMedlem sedan maj 20021 466 inlägg
#8

Engine^ skrev:

Tja... genom att köra MySQL... men det är inte SQL-standard.

Låt höra, jag tänkte ändå byta till MySQL.

Engine^Medlem sedan dec. 20003 887 inlägg
#9

Jag är inte sugen på att lära ut något som inte är "rätt", men det står att läsa om på MySQLs sidor. ;)

MySQL - Developer Zone

GeinMedlem sedan sep. 20005 700 inlägg
#10

Flikar in med en liten fråga. Själv hade jag skrivit den sökta SQL-frågan som:

SELECT p.Name, Max(bid) as maxbid FROM Products p, Bids b WHERE p.ID = b.ProductID GROUP BY b.ProductID

Vad är skillnaden med min fråga och Peeers? Är båda typerna SQL-standard?
(Har aldrig greppat det där med left right inner outer join)

PeeerMedlem sedan mars 20025 907 inlägg
#11

Gein > Med din fråga får du inte ut de produkter som ingen bjudit på.

Marcus > Vad spelar det för roll om du har med en "group by"? Min fråga fungerar klockrent (åtminstone i mysql)

GeinMedlem sedan sep. 20005 700 inlägg
#12

Nej, juste. Men menar du att det inte går att skriva en likvärdig SQL-sats på "mitt sätt" som motsvarar den du skrivit?

Marcus EMedlem sedan maj 20021 466 inlägg
#13

Engine: Jag struntar i vad som är standard eller fel. Huvudsaken är att det fungerar. Du får gärna hänvisa till vilken SQL-sats du tänkte på.

Peer: Frågan blir väldigt lång om jag vill hämta ut många kolumner. Det går inte att använda *.

PeeerMedlem sedan mars 20025 907 inlägg
#14

Möjligt att det går (på något udda vänster) att skriva om din innerjoin (som det är du skrivit), men jag kan det inte i alla fall (har inte försökt iof).

GeinMedlem sedan sep. 20005 700 inlägg
#15

Peeer skrev:

Möjligt att det går (på något udda vänster) att skriva om din innerjoin (som det är du skrivit), men jag kan det inte i alla fall (har inte försökt iof).

Får nog ta och skola om mej då. :)

PeeerMedlem sedan mars 20025 907 inlägg
#16

Marcus E skrev:

Peer: Frågan blir väldigt lång om jag vill hämta ut många kolumner. Det går inte att använda *.

select p.*, max(bid) as maxbid from products as p
left outer join bids as b on b.productid = p.id
group by p.id

Fungerar utmärkt för mig i alla fall.

Marcus EMedlem sedan maj 20021 466 inlägg
#17

Inte i Access: Cannot group on fields selected with '*' (Products).

Vad använder du?

PeeerMedlem sedan mars 20025 907 inlägg
#18

MySQL. Access är inte mycket att hänga i julgranen.

Marcus EMedlem sedan maj 20021 466 inlägg
#19

Jag har kört MySQL ett tag nu och det funkar bra.

Följdfråga kommer här. Jag vill ha ID-numret på maxbudet. Hur skriver jag då? Om jag använder bids.bid får jag fel ID.

LarsGMedlem sedan dec. 200012 464 inlägg
#20

Att Mysql tillåter att man inte anger alla icke-aggregerade kolumner i group by är inget att skryta med. Tvärtom så innebär det att man inte kan förutsäga vilket data man får.

143 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)