Marcus EMedlem sedan maj 20021 466 inlägg Fast det är inget svar på min fråga. Hur förutsäger man vilken data man ska få?
--
Samma sak gäller om jag ställer frågan direkt på bid-tabellen.
mysql> SELECT id, bid,productid FROM bid;
+----+-----+-----------+
| id | bid | productid |
+----+-----+-----------+
| 6 | 0 | 1 |
| 7 | 88 | 1 |
| 8 | 55 | 1 |
+----+-----+-----------+
mysql> SELECT id, MAX(bid) FROM bid GROUP BY productid;
+----+----------+
| id | MAX(bid) |
+----+----------+
| 6 | 88 |
+----+----------+
Jag vill att det ska stå 7, 88 istället eftersom 88 hör till sjuan.
Marcus EMedlem sedan maj 20021 466 inlägg Eftersom jag inte får något svar här så får jag väl lösa det med hjälp av manualen. RTFM brukar man ju säga.
Jag har en känsla av att dessa kan optimeras lite. Ni får gärna säga hur.
Fungerar i MySQL 4.1
====================
SELECT product.id, user.name, MaxBidUser.Name, bid.id as BidID, bid
FROM product
LEFT JOIN bid ON product.id=bid.productid AND
bid=(SELECT MAX(s2.bid)
FROM bid s2
WHERE product.id = s2.productid)
INNER JOIN user on product.userid=user.id
LEFT JOIN user AS MaxBidUser on bid.userid=MaxBidUser.id;
Fungerar i MySQL 4.0
====================
CREATE TEMPORARY TABLE tmp (
productid INT(4) UNSIGNED NOT NULL,
bid INT(4) UNSIGNED NOT NULL);
LOCK TABLES product READ, bid READ, user READ, user AS ProductUser READ, user AS MaxBidUser READ;
INSERT INTO tmp SELECT productid, MAX(bid) FROM bid GROUP BY productid;
SELECT product.id, product.name, ProductUser.Name, bid.id, tmp.bid, MaxBidUser.Name FROM product
INNER JOIN user AS ProductUser ON product.userid=ProductUser.id
LEFT JOIN tmp ON product.id=tmp.productid
LEFT JOIN bid ON bid.productid=tmp.productid AND bid.bid=tmp.bid
LEFT JOIN user AS MaxBidUser ON bid.userid=MaxBidUser.id;
UNLOCK TABLES;
DROP TABLE tmp;
Jag vill använda den översta men MySQL 4.1 verkar ligga långt in i framtiden.
Fast det här blir nog väldigt långsamt. Det är bättre att cacha id-numret till det högsta budet.
LarsGMedlem sedan dec. 200012 464 inlägg Det går att lösa utan en temptabell även i 4.0
SELECT product.id, user.name, MaxBidUser.Name,
bid1.id as BidID, bid1.bid
FROM product
inner join user on product.userid=user.id
LEFT JOIN bid bid1 ON product.id=bid1.productid
left join bid bid2
on bid1.productid = bid2.productid
LEFT JOIN user AS MaxBidUser
on bid.userid=MaxBidUser.id
group by
product.id, user.name, MaxBidUser.Name,
bid1.id , bid1.bid
having bid1.bid = max(bid2.bid)
Min kommentar var mer riktad till peeer så den var väl lite malplacerad, men jag har sett alltför många som får fel på grund av detta beteende.
PeeerMedlem sedan mars 20025 907 inlägg
LarsG skrev:
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.
Hmm, har aldrig råkat ut för några oväntade resultat med den typen av frågor, fast mina frågor brukar inte vara speciellt avancerade heller. :)