Just nu i M3-nätverket
Gå till innehåll

Unika rader i INNER JOIN


Admini

Rekommendera Poster

Hej

Jag hämtar och visar alla rader i tabellen inlagg så här:

 

SELECT f.f_namn, i.titel, i.datum, a.medlem FROM (forum AS f INNER JOIN inlagg AS i INNER JOIN anvandare AS a ON(f.id=i.parent) AND (i.anvId=a.id)) WHERE f.id="&frmId&" ORDER BY i.datum DESC

tabell forum innehåller forumens namn:

id | f_namn |

01| allmän |

02| politik |

 

Tabell inlagg innehåller alla inlägg:

id | parent | titel | tradId | datum |

 

Parent är lika med forum_namn_id

tradId är unik id(tal) för alla inlägg i en o samma tråd

 

Tabell anvandare innehåller användar ID och Namn

 

Ovan SQL-sats funkar och visar alla inlägg efter fallande datum

 

Men nu vill jag visa ENDAST ett senaste inlägg från varje tråd, men det går inte att ha DISTINCT eller MAX tillsammans med INNER JOIN i samma sats:

SELECT f.f_namn, DISTINCT(i.tradId), MAX(i.datum), a.medlem FROM (forum AS f INNER JOIN inlagg AS i INNER JOIN anvandare AS a ON(f.id=i.parent) AND (i.anvId=a.id)) WHERE f.id="&frmId&" ORDER BY i.datum DESC

 

Eller har jag fel?

Tacksam för hjälp!

Länk till kommentar
Dela på andra webbplatser

Börja med att justera din första sats, join-villkoren bör stå vid respektive join! (Faktiskt oglitig syntax i ditt fall, uppfyller ej SQL-standarden...)

 

SELECT f.f_namn, i.titel, i.datum, a.medlem

FROM forum AS f INNER JOIN inlagg AS i ON f.id = i.parent

INNER JOIN anvandare AS a ON i.anvId = a.id

WHERE f.id= "&frmId&"

ORDER BY i.datum DESC

 

 

 

Sedan blandar du ihop begreppen lite. DISTINCT innebär att man endast returnerar unika rader, dvs man plockar bort "kopior" av samtliga kolumner i select-listan.

 

MAX används för att få fram största värdet av t.ex. en kolumn, antingen det totala MAX-värdet (för samtliga rader), eller för en grupp enligt GROUP BY.

 

 

Jag skulle börja med att köra satsen utan DISTINCT och MAX, bara för att se vilket resultat man får:

 

SELECT f.f_namn, i.tradId, i.datum, a.medlem

FROM forum AS f INNER JOIN inlagg AS i ON f.id = i.parent

INNER JOIN anvandare AS a ON i.anvId=a.id

WHERE f.id="&frmId&"

ORDER BY i.datum DESC

 

 

En enkel lösning för att få fram endast senaste inlägget i varje tråd är att slänga in villkor i where-clausen på det:

 

SELECT f.f_namn, i.tradId, i.datum, a.medlem

FROM forum AS f INNER JOIN inlagg AS i ON f.id = i.parent

INNER JOIN anvandare AS a ON i.anvId=a.id

WHERE f.id="&frmId&"

AND i.datum = (SELECT MAX(datum) FROM forum AS f2 INNER JOIN inlagg AS i2 ON f2.id = i2.parent

WHERE i2.tradId = i.tradId)

ORDER BY i.datum DESC

 

Testa!

Länk till kommentar
Dela på andra webbplatser

Börja med att justera din första sats, join-villkoren bör stå vid respektive join! (Faktiskt oglitig syntax i ditt fall, uppfyller ej SQL-standarden...)

 

SELECT f.f_namn, i.titel, i.datum, a.medlem

FROM forum AS f INNER JOIN inlagg AS i ON f.id = i.parent

INNER JOIN anvandare AS a ON i.anvId = a.id

WHERE f.id= "&frmId&"

ORDER BY i.datum DESC

 

 

 

Sedan blandar du ihop begreppen lite. DISTINCT innebär att man endast returnerar unika rader, dvs man plockar bort "kopior" av samtliga kolumner i select-listan.

 

MAX används för att få fram största värdet av t.ex. en kolumn, antingen det totala MAX-värdet (för samtliga rader), eller för en grupp enligt GROUP BY.

 

 

Jag skulle börja med att köra satsen utan DISTINCT och MAX, bara för att se vilket resultat man får:

 

SELECT f.f_namn, i.tradId, i.datum, a.medlem

FROM forum AS f INNER JOIN inlagg AS i ON f.id = i.parent

INNER JOIN anvandare AS a ON i.anvId=a.id

WHERE f.id="&frmId&"

ORDER BY i.datum DESC

 

 

En enkel lösning för att få fram endast senaste inlägget i varje tråd är att slänga in villkor i where-clausen på det:

 

SELECT f.f_namn, i.tradId, i.datum, a.medlem

FROM forum AS f INNER JOIN inlagg AS i ON f.id = i.parent

INNER JOIN anvandare AS a ON i.anvId=a.id

WHERE f.id="&frmId&"

AND i.datum = (SELECT MAX(datum) FROM forum AS f2 INNER JOIN inlagg AS i2 ON f2.id = i2.parent

WHERE i2.tradId = i.tradId)

ORDER BY i.datum DESC

 

Testa!

 

 

Ska alldeles strax testa den...

Nu har jag testat och det funkar som det ska! STORT tack...

Du hade bara glömt en liten sak där jag markerat med rött

... AND i.datum = (SELECT MAX(i2.datum) FROM forum AS f2 INNER JOIN inlagg ...

 

Sedan några saker, med DISTINCT menar jag precis som du beskriver:"DISTINCT innebär att man endast returnerar unika rader, dvs man plockar bort "kopior" av samtliga kolumner i select-listan"

Och det var kolumn tradId som innehåller gemensamma id för alla inlägg i en o samma tråd.

 

Kan jag nu returnera antal inlägg i samma tråd för varje tråd i den SQL-sats du har gett mig?

 

 

Länk till kommentar
Dela på andra webbplatser

Snabblösning är att slänga in en sub-select som räknar antalet rader:

SELECT f.f_namn, i.tradId, i.datum, a.medlem, (SELECT COUNT(*) FROM inlagg AS i3 WHERE i3.tradid = i.tradId) AS antal

FROM forum AS f INNER JOIN inlagg AS i ON f.id = i.parent

INNER JOIN anvandare AS a ON i.anvId=a.id

WHERE f.id="&frmId&"

AND i.datum = (SELECT MAX(i2.datum) FROM forum AS f2 INNER JOIN inlagg AS i2 ON f2.id = i2.parent

WHERE i2.tradId = i.tradId)

ORDER BY i.datum DESC

Länk till kommentar
Dela på andra webbplatser

Snabblösning är att slänga in en sub-select som räknar antalet rader:

SELECT f.f_namn, i.tradId, i.datum, a.medlem, (SELECT COUNT(*) FROM inlagg AS i3 WHERE i3.tradid = i.tradId) AS antal

FROM forum AS f INNER JOIN inlagg AS i ON f.id = i.parent

INNER JOIN anvandare AS a ON i.anvId=a.id

WHERE f.id="&frmId&"

AND i.datum = (SELECT MAX(i2.datum) FROM forum AS f2 INNER JOIN inlagg AS i2 ON f2.id = i2.parent

WHERE i2.tradId = i.tradId)

ORDER BY i.datum DESC

 

Vad konstigt.

Jag får värden som är 2,5 gånger högre än de riktiga värdena

t.ex en tråd med 3 inlägg visar Antal:5 st och en annan med 5 visar 18 !?

Länk till kommentar
Dela på andra webbplatser

Vad konstigt.

Jag får värden som är 2,5 gånger högre än de riktiga värdena

t.ex en tråd med 3 inlägg visar Antal:5 st och en annan med 5 visar 18 !?

 

Underligt...

 

Kan kanske ett inlägg hamna på flera rader i inlagg-tabellen om det är långt?

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...