Hej! Koden ser lite skum ut, varför har du distingvt, osv.? Nåt sånt här kanske (obs helt otestat): <b>Du kan ju inte ha nyheter.titel om du inte har group på den (t.ex.)... </b> <b>MySQL godkänner det vill jag minnas</b> Vad är det som garanterar att ProductName är entydig per rad? <b>Vad är det som garanterar att ProductName är entydig per rad?</b> Det kan vara en bra idé att göra en specifik tabell för städer (förutsatt att du kan ändra på tabellerna), det borde underlätta för framtiden och gör det mycket enklare om du t.ex. vill ha en lista över möjliga val av stad.Kör fast i SQL Distinct
Har en tabell med städer (4 st) och en nyhetstabell med nyheter för varje stad. Vad försöker göra är att skriva ut den senaste nyheten för varje stad alltså max 4 st nyheter på sidan. Med följande kod får jag fram en nyhet för varje stad. Problemet är att den plockar ut nyheter med gamla datum . Nåt knas med sorteringen alltså
SELECT DISTINCT(nyheter.stad), nyheter.id, nyheter.titel, nyheter.texten, stad.stad FROM nyheter
LEFT JOIN stad ON stad.id=nyheter.stad GROUP BY nyheter.stad ORDER BY nyheter.datum
Vet nåt geni här hur man löser detta enklast?
Tack på förhand!
//DSv: Kör fast i SQL Distinct
Fungerar frågan alls?
Du kan ju inte ha nyheter.titel om du inte har group på den (t.ex.)...
Jag skulle skriva frågan som först:
SELECT stad, MAX(datum) FROM nyheter GROUP BY stad
för att få ut rätt datum och städer, och sen
SELECT nyheter.id, nyheter.titel, nyheter.texten, stad.stad FROM
((SELECT stad, MAX(datum) AS datum FROM nyheter GROUP BY stad) AS N
LEFT JOIN nyheter ON nyheter.stad = N.stad AND nyheter.datum = N.datum)
LEFT JOIN stad ON stad.id=nyheter.stad
för att använda just de städerna. Det kan bli lite enklare att se vad man gör om man som mellansteg hämtar ut ID:na
SELECT ID FROM nyheter RIGHT JOIN (SELECT stad, MAX(datum) FROM nyheter GROUP BY stad) AS N
ON N.stad = nyheter.stad AND nyheter.datum = N.datum
Det kan du sen lägga i en view (eller "stored query" om du använder Access).Sv: Kör fast i SQL Distinct
select *
from nyheter n
join
(
select stad, max(id) as nid -- ta ut senaste per stad, alt max(datum)
from nyheter
group by stad
) tmp on tmp.nid = n.id and tmp.stad = n.stad
JOIN stad s ON s.id=n.stad
order by n.datumSv:Kör fast i SQL Distinct
MySQL godkänner det vill jag minnas, verkar ta vilket värde som helst. Helt vansinnigt att man inte får syntaxfel på det tycker jag då man väldigt ofta missat en GROUP BY i det läget.
/JohanSv: Kör fast i SQL Distinct
Korrekt.
Jag kan delvis hålla med om att MySQL borde - om inte ge fel - så åtminstone varna när det inte finns en entydig rad att välja vid GROUP BY. Däremot tycker jag inte att man alltid skall behöva köra GROUP BY på varje fält som inte är en gruppfunktion. Om man har t.ex.
SELECT ProductId, ProductName, COUNT(*)
FROM Product
INNER JOIN Orderline
USING (ProductId)
GROUP BY ProductId
där ProductId är primärnyckel i tabellen Product, är ju ProductName entydigt given för varje rad.
Sv:Kör fast i SQL Distinct
Du borde väl rimligtvis ställa ett uniqueness-constraint på ProductName också då?
Då skulle jag kunna köpa det.Sv: Kör fast i SQL Distinct
Jag glömde skriva att ProductName ligger i tabellen Product.
Eftersom ProductId är primärnyckel i Product kan det inte finnas flera ProductName för samma ProductId. Så när vi kör GROUP BY ProductId finns det ingen oklarhet om vilket värde ProductName kommer att få i varje rad av resultatet.Sv: Kör fast i SQL Distinct
<code>
ID Stad
1 Stockholm
2 Helsingfors
3 Paris
</code>
och sen länkar du ihop tabellerna baserat på ID med en inner join eller liknande.