WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   SQl problem/fråga (https://www.wn.se/forum/showthread.php?t=35899)

Ixzat 2009-03-21 17:02

Jag håller på att sätta upp en sida som är i princip färdig förutom att jag inte får ordning på en liten sql sak.

Jag har ett artikelsystem där inloggade användare skall kunna markera en artikel som läst, vilket gör att den aldrig mer visas för just den användaren.

Som det ser ut nu så har jag en tabell som heter "artiklar" och en som heter "lasta_artiklar".

Under artiklar har jag följande fält: id, art_txt, user_id, created.
Under lasta artiklar har jag: id, art_id, user_id.

Jag vill få ut en sql sats som gör att den listar alla artiklar förutom de som användaren har satt som lästa, dvs de som har samma art_id i "lasta_artiklar" som id i "artiklar och med samma user_id som den inloggade användaren.

Bör jag bygga om mina tabeller eller går det att lösa smidigt på något sätt?

WizKid 2009-03-21 17:09

Kod:

SELECT a.* FROM artiklar AS a LEFT JOIN lasta_artiklar AS la ON la.art_id = a.id AND la.user_id = 17 WHERE la.id IS NULL;

Ixzat 2009-03-21 17:29

Super, tack så mycket!!

Ixzat 2009-03-22 02:45

En fråga till, kan man få order by random på en sådan sql sats? Jag har provat mig fram men inte lyckats få till det. Limit får jag in, men inte random...

Conny Westh 2009-03-22 03:42

Jag ser ingen anledning varför du ska ha user_id i artikel-tabellen.
Det räcker gott med att du lagrar user_id och art_id i lasta_artiklar-tabellen, då har du all info du behöver, du behöver inte heller ha ett eget id i lasta_artiklar-tabellen eftersom art_id och user_id tillsammans blir en unik nyckel.

user_id i artikeltabellen är en felaktig normalisering som jag ser det, id i lasta_artiklar är bara överflödig information.

Tabellerna behöver bara följande kolumner:

Kolumner i Artiklar: art_id, art_txt, created.
Kolumner i Lasta_Artiklar: art_id, user_id.
Kolumner i User: user_id.



Kod:

SELECT **
FROM * * artiklar
WHERE *id NOT IN(SELECT art_id FROM Lasta_artiklar WHERE *user_id = 17);

Observera den lite fiffiga användningen av en subselect som plockar fram en lista på alla art_id som användaren med user_id = 17 har läst och att den NOT som är före subselecten vänder logiken så hela SQL-satsen visar alla artiklar som användaren INTE läst tidigare....

oller 2009-03-22 08:34

Citat:

Originally posted by Ixzat@Mar 22 2009, 03:45
En fråga till, kan man få order by random på en sådan sql sats? Jag har provat mig fram men inte lyckats få till det. Limit får jag in, men inte random...

MySQL: ORDER BY RAND()
MSSQL: ORDER BY NEWID()

Mvh

WizKid 2009-03-22 15:01

ConnyWesth: Det beror ju helt och hållet på vad user_id i artikel databasen är. Min gissning är att det är användaren som skapat artikeln så kan du ju inte plocka bort den.


Alla tider är GMT +2. Klockan är nu 18:38.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson