Svenska 3D-Tåg - Forum

Svenska 3D-Tåg - Forum (http://www.e-buzz.se/forum/index.php)
-   Off-topic (http://www.e-buzz.se/forum/forumdisplay.php?f=15)
-   -   Avancerad SQL fråga (http://www.e-buzz.se/forum/showthread.php?t=4520)

hp 2003-06-25 01:16

Avancerad SQL fråga
 
Tjena!

Kanske fel forum att skriva i men jag kastar ut frågan ändå, någon kanske kan lösningen... Om Du inte kan något om databaser, ta dig inte äns tid att försöka förstå detta ;)

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

Kod:

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??

http://www.e-buzz.net/forum/attachments2/1419101949.gif

HP
Moderator Svenska 3D-Tåg
Regler

Mson 2003-06-25 10:35

Posta detta i Sweclockers oxå så har du 2 ställen att kolla på:

http://forum.sweclockers.com/

Posta under: Programmering - Webdesign - Grafisk design

Där har jag sett några som postat liknande fraser och fått "scriptet" korrigerat!

MvH. Mson
http://www.e-buzz.net/forum/attachments/5093193218.jpg

http://www.tagbilder.com

zerax 2003-06-25 13:45

http://www.phpportalen.net är ett mycket bättre ställe att fråga om SQL frågor. Sweclockers är visserligen bra men phpportalen i detta fallet är mycket bättre.

---------------
zerax@nordictech.com
http://www.zerax.mine.nu
http://www.nordictech.com

hp 2003-06-25 16:51

Tack! Jag har postat på dessa forum!

http://www.e-buzz.net/forum/attachments2/1419101949.gif

HP
Moderator Svenska 3D-Tåg
Regler

ErikFalken 2003-06-26 06:41

SELECT DISTINCT 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


borde fungera! När du söker i en SQL databas är det nästan undantagslöst nödvändigt att använda SELECT DISTINCT

Erik Falkenström
http://www.e-buzz.net/forum/attachments/9910223735.jpg

http://www.erikfalken.fotosidan.se

hp 2003-06-26 16:34

Blir felmeddelande, jag kan använda den för att välja alla id nummer och sedan med en IN sats plocka upp det men det blir en delbar opperation...

http://www.e-buzz.net/forum/attachments2/1419101949.gif

HP
Moderator Svenska 3D-Tåg
Regler

ErikFalken 2003-07-07 17:04

Citat:

quote:Tidigare skrev hp

Blir felmeddelande, jag kan använda den för att välja alla id nummer och sedan med en IN sats plocka upp det men det blir en delbar opperation...

http://www.e-buzz.net/forum/attachments2/1419101949.gif

HP
Moderator Svenska 3D-Tåg
Regler

Hm, prova:
SELECT DISTINCT * FROM news WHERE news.general = 1 OR group_news.newsid = news.newsid AND group_news.groupid = 1 ORDER BY news.changedate DESC/erik

Erik Falkenström
http://www.e-buzz.net/forum/attachments/9910223735.jpg

http://www.erikfalken.fotosidan.se

hp 2003-07-07 19:10

Nix, resulterar i fel, anledningen är att destinct ändast går att använda på id nummer, med andra ord, textfältet title och message går inte...

Jag fick hjälp på ett annat forum, den rätta satsen ä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

Med andra ord en Select sats i Selectsatsen...

Så är det...

http://www.e-buzz.net/forum/attachments2/1419101949.gif

HP
Moderator Svenska 3D-Tåg
Regler

ErikFalken 2003-07-07 20:23

Citat:

quote:Tidigare skrev hp

Nix, resulterar i fel, anledningen är att destinct ändast går att använda på id nummer, med andra ord, textfältet title och message går inte...

Jag fick hjälp på ett annat forum, den rätta satsen ä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

Med andra ord en Select sats i Selectsatsen...

Så är det...

http://www.e-buzz.net/forum/attachments2/1419101949.gif

HP
Moderator Svenska 3D-Tåg
Regler

Jasså, skumt...
Jag brukar alltid använda SELECT DISTINCT när jag söker, oavsett om det gäller ID fält (sätter oftast den till integer 10 bytes) eller textfält, char eller annat t.ex. datum. Kör förresten MySQL, vad använder du, kan det var ngt skumt där, om du kör MS Access som använder JetSQL?

Jag har en annan idé, om du har lust så testa gärna, den kan fungera, eller så gör den inte det :-)

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

Erik Falkenström
http://www.e-buzz.net/forum/attachments/9910223735.jpg

http://www.erikfalken.fotosidan.se

Daniel R 2003-07-07 22:03

Lite OT: Vad har DISTINCT för funktion när man kör med SELECT *[?]
DISTINCT ska ju sortera bort dubletter, och några dubletter ska ju inte kunna finnas om man hämtar alla poster. Speciellt inte på ID-fältet som Erik beskriver?

// Daniel

ErikFalken 2003-07-07 22:43

Citat:

quote:Tidigare skrev Daniel R

Lite OT: Vad har DISTINCT för funktion när man kör med SELECT *[?]
DISTINCT ska ju sortera bort dubletter, och några dubletter ska ju inte kunna finnas om man hämtar alla poster. Speciellt inte på ID-fältet som Erik beskriver?

// Daniel
Jag vet inte varför, det finns säkert någon bra förklaring, men om man söker på * brukar det alltid dyka upp dubletter. Söker du på enbart ID så borde det ju inte hända, men jag vet inte. Jag kör alltid med distinct, har funkat hittils i mina enkla SQL frågor iallafall :-)

Erik Falkenström
http://www.e-buzz.net/forum/attachments/9910223735.jpg

http://www.erikfalken.fotosidan.se


Alla tider är GMT +2. Klockan är nu 00:51.

Powered by vBulletin® Version 3.7.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
© Svenska 3D-Tåg 2001-2009