webForumDet fria alternativet

Avancerad SQL fråga

4 svar · 319 visningar · startad av hplarsson

hplarssonMedlem sedan juni 20032 inlägg
#1

Tjena!

Fick tips om detta forum, vi gör ett försök och kolla om någon kanske kan hjälpa mig...

Jag håller på att lösa ett SQL problem som var svårare att lösa än jag trodde.

Databasen ser ut som följer

- groups, innehåller information om olika grupper
- news, innehåller nyhetsinlägg, här finns en flagga som heter general, om den är satt så skall inlägget visas oavsatt vilken grupp man är inloggad i.
- groups_news, är en länklista mellan groupid och newsid

Jag skall nu göra en lista på alla nyhetsinlägg som är relevanta för den inloggade personenen, som har valt vilken grupp han är med i, dess utom om ingen grupp är vald skall bara de generella inläggen visas. Denna lista skall vara sorterad DESC efter changedate som finns i tabellen news.

Om vi struntar i JOINS och CROSS JOINS och kör den gammla hedliga vägen, jag har testat JOINS, det funkar precis lika dant, så borde en sådan sats med inloggning i grupp med id 1 se ut något som

SELECT news.* FROM news, group_news WHERE news.general = 1 OR group_news.newsid = news.newsid AND group_news.groupid = 1 ORDER BY news.changedate DESC

Denna sats funkar finfint till dess att man skaffar mer än ett inlägg som är kopplad till samma grupp, då börjar nämligen alla inlägg som är generella duplicera sig så många gånger som det finns gruppanknytna inlägg. Rent SQL mässigt/matematiskt är detta rätt, WHERE satsen utvärderas för varje inlägg vilket kommer resultera i detta.

Någon som kan komma på en rätt och riktig sats för att åstatkomma det jag vill??

Mvh
Hans-Petter "HP" Larsson

agneta_rungMedlem sedan juli 2002138 inlägg
#2

Så här:

SELECT * FROM news 
WHERE news.general = 1 
OR EXISTS 
  (SELECT * FROM group_news
  WHERE group_news.newsid = news.newsid 
  AND group_news.groupid = 1) 
ORDER BY news.changedate DESC

eller så här:

SELECT * FROM news 
WHERE news.general = 1 
OR news.newsid =  
  (SELECT newsid FROM group_news
  WHERE group_news.newsid = news.newsid 
  AND group_news.groupid = 1) 
ORDER BY news.changedate DESC

Vilket som är effektivast prestandamässigt beror nog på databashanterare. I SQLServer2000 är det EXISTS som gäller.

LarsGMedlem sedan dec. 200012 465 inlägg
#3

Frågorna är inte ekvivalenta eftersom = (subslect) innebär att subselecten får returnera högst ett värde.

Använd in (subselect) i stället.

agneta_rungMedlem sedan juli 2002138 inlägg
#4

LarsG har så rätt (i vanlig ordning)!! :)

hplarssonMedlem sedan juni 20032 inlägg
#5

Jag tackar för detta svar, det funkar!!!

Mvh
HP

Genererad på 371 ms · cache AV · v20260730165559-full.f96bc7eb