WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   behöver lite hjälp med en SQL (https://www.wn.se/forum/showthread.php?t=1067272)

naak2803 2016-09-08 13:05

behöver lite hjälp med en SQL
 
Hej,
behöver lite hjälp med att utforma en SQL för ett meddelande-system:

såhär ser min databasstruktur ut lite förenklat

table.dbo.messages
sender_id_fk, receiver_id_fk, date, message, seen

table.dbo.users
id, firstname, lastname, ...

Det jag nu vill åstadkomma är att ta ut en lista med användare sorterad på "seen" (int)

jag får problem eftersom [messages] kan innehålla flera radera till samma användare där vissa är "seen" och andra inte..

digiArt 2016-09-08 13:38

Typ (otestat):

SELECT DISTINCT(sender_id_fk) FROM messages WHERE seen = 1 GROUP BY sender_id_fk

Sen får du göra en join mot users

naak2803 2016-09-08 13:58

Citat:

Ursprungligen postat av digiArt (Inlägg 20519821)
Typ (otestat):

SELECT DISTINCT(sender_id_fk) FROM messages WHERE seen = 1 GROUP BY sender_id_fk

Sen får du göra en join mot users

nja, nu får jag bara ut en rad, vilket är förståeligt med tanke på att man skriver seen = 1 ... den ska ju bara sortera efter seen.

SELECT DISTINCT(m.sender_id_fk) FROM message m RIGHT JOIN users u ON u.id=m.sender_id_fk WHERE m.seen = 1 GROUP BY m.sender_id_fk

gregoff 2016-09-08 14:34

Citat:

Ursprungligen postat av naak2803 (Inlägg 20519823)
nja, nu får jag bara ut en rad, vilket är förståeligt med tanke på att man skriver seen = 1 ... den ska ju bara sortera efter seen.

SELECT DISTINCT(m.sender_id_fk) FROM message m RIGHT JOIN users u ON u.id=m.sender_id_fk WHERE m.seen = 1 GROUP BY m.sender_id_fk

Om du ska sortera efter något så får du lägga till ORDER BY seen ASC (alternativt DESC istället för ASC om du vill vända på sorteringen)

naak2803 2016-09-08 15:04

Citat:

Ursprungligen postat av gregoff (Inlägg 20519824)
Om du ska sortera efter något så får du lägga till ORDER BY seen ASC (alternativt DESC istället för ASC om du vill vända på sorteringen)

riktigt så enkelt är det ju inte.. eftersom det bara finns en rad med användare och en användare kan ha flera meddelande kopplade till sig som i sintur ska vara sorterade på seen.

naak2803 2016-09-08 15:16

så långt har jag kommit

SELECT DISTINCT(m.sender_id_fk), u.firstname, u.lastname, m.seen FROM message m RIGHT JOIN users u ON u.id=m.sender_id_fk GROUP BY m.sender_id_fk ORDER BY m.seen, m.created

Problemet med denna är ju att måste sortera själva GROUP BY på seen eftersom den råkar bara ta den senaste seen

fabian 2016-09-08 15:46

Borde du inte istället ha en kolumn i varje användares tabell där du sätter ID't av det meddelande den såg senast.

När man postar ett meddelande så uppdateras den kolumnen med det ID meddelandet får.

När man kollar på meddelandena så uppdateras den med det högsta i den tråden.

naak2803 2016-09-08 15:51

Citat:

Ursprungligen postat av fabian (Inlägg 20519828)
Borde du inte istället ha en kolumn i varje användares tabell där du sätter ID't av det meddelande den såg senast.

När man postar ett meddelande så uppdateras den kolumnen med det ID meddelandet får.

När man kollar på meddelandena så uppdateras den med det högsta i den tråden.

njea, jag vill ju ha en lista med användare sorterad på olästa meddelande.

fabian 2016-09-08 16:00

Citat:

Ursprungligen postat av naak2803 (Inlägg 20519829)
njea, jag vill ju ha en lista med användare sorterad på olästa meddelande.

Hur skall du använda det? Det kanske hjälper att förstå vad du vill åstadkomma.

naak2803 2016-09-08 16:32

Citat:

Ursprungligen postat av fabian (Inlägg 20519830)
Hur skall du använda det? Det kanske hjälper att förstå vad du vill åstadkomma.

användarna ska kunna skicka meddelande till varandra, längst ut till vänster är det tänk att visa en lista på användarna...

denna lista vill jag sortera på användare som jag har minst en oläst meddelande ifrån.

allstars 2016-09-08 17:09

ORDER BY m.seen ASC, m.created DESC

[edit]
Jaha, men du får kanske göra en MAX(m.seen) som du sorterar på, kanske?!

[edit 2]
Neä nu hade jag lite otur när jag tänkte.... men oh well... pass

Nerix 2016-09-08 17:47

Citat:

Ursprungligen postat av naak2803 (Inlägg 20519832)
användarna ska kunna skicka meddelande till varandra, längst ut till vänster är det tänk att visa en lista på användarna...

denna lista vill jag sortera på användare som jag har minst en oläst meddelande ifrån.

Något sådan här;

Kod:

SELECT notifications. receiver_id, notifications.seen
FROM (
  SELECT DISTINCT(message. receiver_id_fk) as receiver_id, message.seen
  FROM message
  WHERE receiver_id = <current user id>
) notifications
ORDER BY notifications.seen DESC

Byt ut `<current user id>` but användarens id och joina med `users`-tabellen så är du klar.

Ett litet tips; undvik att använda förkortningar i SQL-kod du vill ha hjälp med. Även om `m` och `u` gör koden mer kompakt så blir den svårläst för personer som inte skrivit koden.

naak2803 2016-09-08 18:00

Citat:

Ursprungligen postat av Nerix (Inlägg 20519835)
Något sådan här;

Kod:

SELECT notifications. receiver_id, notifications.seen
FROM (
  SELECT DISTINCT(message. receiver_id_fk) as receiver_id, message.seen
  FROM message
  WHERE receiver_id = <current user id>
) notifications
ORDER BY notifications.seen DESC

Byt ut `<current user id>` but användarens id och joina med `users`-tabellen så är du klar.

Ett litet tips; undvik att använda förkortningar i SQL-kod du vill ha hjälp med. Även om `m` och `u` gör koden mer kompakt så blir den svårläst för personer som inte skrivit koden.

har du skapat en ny tabell nu eller? "notifications"

digiArt 2016-09-08 19:43

Citat:

Ursprungligen postat av naak2803 (Inlägg 20519836)
har du skapat en ny tabell nu eller? "notifications"

Notifications är ett alias på den "tabell" som skapas av den selectsats som är i den inre parentesen.

Det nerix skriver är sannolikt vad du söker.

naak2803 2016-09-09 00:31

Citat:

Ursprungligen postat av digiArt (Inlägg 20519840)
Notifications är ett alias på den "tabell" som skapas av den selectsats som är i den inre parentesen.

Det nerix skriver är sannolikt vad du söker.

hehe oj missa det... ;) :D

fabian 2016-09-09 07:16

Lägg upp den på http://sqlfiddle.com/


Alla tider är GMT +2. Klockan är nu 09:12.

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