webForumDet fria alternativet

Enklaste sättet att slippa bamseselect?

Databaser & SQL

9 svar · 383 visningar · startad av Joakim

Medlem sedan dec. 199982 inlägg
Frågan#1

Hellu,

Följande problem klurar jag lite på, exempel:

Vi har tre tabeller, en med nyheter med fält för tid, unikt id, rubrik, text och nyhetskategori samt en tabell med användarnas val av vilka nyhetskategorier de vill bevaka.

Tabell 'news':

ID
UID
CATEGORY_UID
HEADLINE
TEXT

Tabell 'news_selections':

ID
UID
USER_UID
CATEGORY_UID

Tabell 'news_category':

ID
UID
NAME

Kan jag göra någon form av select som väljer de nyhetsartiklar som ligger i någon av de kategorier som användaren valt att prenumerera på?

Annars kan jag tänka mig att man kan loopa igenom 'news_selections' och låta mitt script bygga en selectsats och lägga till de kategorier som en viss användare valt. Detta blir dock en bamseselect som jag inbillar mig att man gärna slipper. Och jag vill ju ha allt så dynamiskt som möjligt för att enkelt kunna lägga til / ta bort t.ex. kategorier.

Upplys mig =)

Medlem sedan dec. 200012 464 inlägg
#2
select news.id,news.headline,news.text
from news join news_selection
on news.category_uid = news_selection.category_uid
where uid = 4711

Med reservation för feltolkning av olika kolumners innebörd.

Flyttas från Mysql.

Medlem sedan mars 20032 667 inlägg
#3

Om databashanteraren är MySQL så köper den inte att bara skriva "join", utan du måste definiera vilken join du gör: "left, inner, right osv".

Medlem sedan dec. 200012 464 inlägg
#4

Så står det inte i deras dokumentation. Sickna enar.

Medlem sedan mars 20032 667 inlägg
#5

LarsG skrev:

Så står det inte i deras dokumentation. Sickna enar.

Då ljuger de. ;)

Jag har vid flertalet tillfällen fått fel i 3.58 på grund av detta. Sedan när jag skrivit ut vilken typ av join jag vill göra har det fungerat.

select * from GroupUser g
inner join User u
on g.userId = u.userId

Ger ett väntat resultat på mina testtabeller

select * from GroupUser g
join User u
on g.userId = u.userId

Ovanstående ger:

You have an error in your SQL syntax near 'ON g.userId = u.userId' at line 3

Medlem sedan jan. 2004501 inlägg
#6

Detta kanske är en sugit lösning men något i denna stil:
SELECT * FROM news WHERE CATEGORY_UID = (SELECT CATEGORY_UID FROM news_selections WHERE USER_UID = X)

Slö men enkel lösning.

X är användar id:t

Medlem sedan dec. 200012 464 inlägg
#7

Den lösningen fungerar inte i Mysql. Dessutom så är det bättre med in än = i detta fall.

Medlem sedan dec. 199982 inlägg
#8

Jag vet inte om jag var otydlig =) men det finns ett antal kategorier, sport, inrikes, nöje osv. det jag vill kunna göra är att lista de nyheter vars kategori är någon av de som som den aktuell användare valt och som finns. Så om användare 01 har valt kategori 02 och 03 för att förenkla det hela så ska selecten välja de nyheter som finns i kategori 02 och 03. har för mycket feber för att förklara det här vettigt *sucka* det är nog enklare än vad jag får det till dock =)

Medlem sedan dec. 200012 464 inlägg
#9

Vad är det för problem med den fråga som jag föreslog?

Medlem sedan dec. 199982 inlägg
#10

Nejdå, mina exempel var ju klart förenklade, men med lite eftertanke så var det ju egentligen inte så svårt. Fokuserade nog bara på fel tänk =)

Tack!

254 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)