SQL-gruppering

Tråden skapades och har fått 10 svar. Det senaste inlägget skrevs .
1

Nu är det dags igen!

Anledningen till att jag aldrig frågat om detta är att jag förutsatt att det varit omöjligt, men kanske ändå inte...

Jag är dessvärre låst till mysql i det här projektet, men det kanske är en fördel eftersom mySQL AB inte följer SQL-standarden rakt av....

Vad jag vill göra är att LIMIT-a ett resultat efter en gruppering. D v s t ex efter id, så att jag får 5 unika id även om det kanske innebär 25 rader (när joinarna har slagit in)

Ex:

SELECT periodikaid, namn, spraaknamn AS spraak, info, startaar, slutaar, kommentar
FROM (
bibl_periodika
JOIN bibl_periodika_yearspan ON periodikaid = rel_periodikaid
)
JOIN bibl_spraak ON spraak = spraakid

ger

+-------------+----------------------+---------+-------------------+----------+---------+---------------------+
| periodikaid | namn                 | spraak  | info              | startaar | slutaar | kommentar           |
+-------------+----------------------+---------+-------------------+----------+---------+---------------------+
|           3 | test                 | Svenska | hej               |     2000 |    2000 |                     |
|           4 | test                 | Svenska | hej               |     2000 |    2000 |                     |
|           5 | test                 | Tyska   | hej               |     2000 |    2000 |                     |
|           5 | test                 | Tyska   | hej               |     2000 |    2000 |                     |
|           5 | test                 | Tyska   | hej               |     1999 |    1999 |                     |
|           6 | teknik för alla      | Svenska | Jättemånga nummer |     1976 |    1977 | Nummer 2 -76 saknas |
|           7 | national geographics | Svenska | natur             |     2000 |    2000 |                     |
|           7 | national geographics | Svenska | natur             |     1981 |    1983 | nr 2 saknas         |
|           7 | national geographics | Svenska | natur             |     1985 |    1986 | asdffasdfsafasfasdf |
+-------------+----------------------+---------+-------------------+----------+---------+---------------------+

Men vid utskrift vill jag skriva ut 10 unika periodikaid, och inte 3 unika som en limit på 10 ger upphov till.

Och jag vill helst inte skippa joinen och för varje rad göra ett anrop som i sin tur hämtar den relaterade datan... Eller hämta allt på en gång och låta PHP sköta biffen...

Så finns det något smart sätt att limita på efter gruppering / unikt id?

/.scooter

SELECT periodikaid, namn, spraaknamn AS spraak, info, startaar, slutaar, kommentar
FROM (
bibl_periodika
JOIN bibl_periodika_yearspan ON periodikaid = rel_periodikaid
)
JOIN bibl_spraak ON spraak = spraakid

Pratar vi inte bara en GROUP BY eller förstår jag bara inte vad du menar?

SELECT periodikaid, namn, spraaknamn AS spraak, info, startaar, slutaar, kommentar
FROM bibl_periodika
LEFT JOIN bibl_periodika_yearspan ON bibl_periodika.periodikaid = bibl_periodika_yearspan.rel_periodikaid
LEFT JOIN bibl_spraak ON bibl_periodika.spraak = bibl_spraak.spraakid
GROUP BY bibl_periodika.periodikaid
LIMIT 10

Nej, vad jag vill ha är olika antal rader. Jag vill inte "förlora" de relaterade posterna.

jag vill ha en listning enl:

* periodikaid1
startaar1 - slutaar1
startaar2 - slutaar2
startaar3 - slutaar3
* periodikaid2
startaar1 - slutaar1
startaar2 - slutaar2
startaar3 - slutaar3
* periodikaid3
startaar1 - slutaar1
startaar2 - slutaar2
startaar3 - slutaar3

Listningen ovan innebär, vid ett anrop till databasen med en join för att hämta den relaterade datan, att 12 rader returneras. Har jag en LIMIT 10 på anropet, så kommer endast följande poster returneras:

* periodikaid1
startaar1 - slutaar1
startaar2 - slutaar2
startaar3 - slutaar3
* periodikaid2
startaar1 - slutaar1
startaar2 - slutaar2
startaar3 - slutaar3
* periodikaid3
startaar1 - slutaar1

Eftersom det kan finnas olika antal startaar - slutaar till varje periodikaid, vet man inte hur många som kommer returneras i förväg.

Det jag vill göra är att i SQL-satsen sätta en LIMIT 10 (ex) efter periodikaid, så att jag kommer få 10 unika periodikaid, men inte nödvändigtvis 10 rader, utan kanske 30 i något fall, 47 i ett annat, beroende på antal relatarede poster...

Blev det klarare eller diffusare nu?

Jag tror som sagt själv inte att det kan låta sig göras i SQL-sättningen, utan att den relaterade datan måste hämtas för varje periodikaid med resultatet 10 extra databasanrop per listning (om LIMIT 10 gäller)....

Hmm, så där lite snabbt så skulle det räcka med 2 sökningar isåfall, inte 11 som du föreslår. En som söker upp med gruppering som jag visade och sen när du vet vilka dom 10 blev så skriver du in det i sökningen "AND periodikaid = 3 AND periodikaid = 2 osv på en lika sökning.

Då klarar du dig på 2 sökningar iaf.

Men som sagt, ska ta en funderare till på det. Vilken version av MySQL använder du? 3 eller 4?

  • Medlem
  • Höganäs
  • 2004-06-24 07:10
Ursprungligen av Patric Malm:

Hmm, så där lite snabbt så skulle det räcka med 2 sökningar isåfall, inte 11 som du föreslår. En som söker upp med gruppering som jag visade och sen när du vet vilka dom 10 blev så skriver du in det i sökningen "AND periodikaid = 3 AND periodikaid = 2 osv på en lika sökning.

Då klarar du dig på 2 sökningar iaf.

Hur ser den söksträngen ut ?

Jo, jag hårddrog det lite, för att illustrera problemet. Första sökningen kan dessutom klaras av utan group by, men det är inte riktigt det som är problemet...

Eftersom jag saknat den här möjligheten så ofta, och det känns som ett grundläggande och enkelt sätt att requesta data, borde det finns någon lösning... Mysql AB är ju duktiga på egna, ej standardiserade features, så vem vet?

Versionen är 4.0 någonting...

Som jag förstod det menade han att man i första söker upp samtliga träffar utan relaterad data, och i andra sökningen hämtar all relaterad data som hör till någon av träffarna i resultat 1 och sorterar dem på ett relevant sätt.

Sedan används middleware för att finna ut vad som hör vart och skriva ut det på rätt ställe.

Nej, det behöver du inte göra. Använd bara middleware för att bygga den nya SQL-stringen. Ska visa snart, ska bara dra till jobbet.. lite stressigt just nu

  • Medlem
  • Höganäs
  • 2005-02-25 09:09

Hur gick det?

Bra fråga - kommer faktskt inte ihåg... :/

  • Medlem
  • Höganäs
  • 2005-02-26 07:43
Ursprungligen av scooterbabe:

Bra fråga - kommer faktskt inte ihåg... :/

Jag känner igen fenomenet...

1
Bevaka tråden