Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2009-10-29, 22:03
  #1
Medlem
Håller på att göra ett forum men nu är det så att jag fastnade lite på en grej.
Det jag vill göra är att hämta både den aktiva kategorins namn och namnet på den kategori som ligger över. Jag vet att det går att göra med mer än en query men jag undrar om det går att få ihop det i en.
Just nu ser den ut såhär...
Kod:
SELECT @in_id:= in_id, name FROM forum_categories WHERE id = 2 OR id = @in_id
Men den ger mig bara namnet och @in_id på kategorin med id 2 .

Tabellen har tre fält:
name
id
in_id - id:n på kategorin en nivå upp
Citera
2009-10-29, 23:03
  #2
Moderator
Protons avatar
Nånting sånt här?

Kod:
SELECT tbl2.id,tbl2.name FROM (
(
SELECT id,name,in_id FROM forum_categories) AS tbl1
UNION
SELECT id
,name,in_id FROM forum_categories WHERE id tbl1.in_id) AS tbl2 
Den där borde väl kunna funka tror jag?
__________________
Senast redigerad av Proton 2009-10-29 kl. 23:05.
Citera
2009-10-29, 23:10
  #3
Medlem
Den ger mig "#1064 - You have an error in your SQL syntax ... to use near 'tbl2' at line 4"
Citera
2009-10-29, 23:17
  #4
Moderator
Protons avatar
Ja okej då....får väl försöka med en annan, den där var kanske inte så bra i första läget btw

Kod:
SELECT id,name FROM forum_categories f1
LEFT JOIN
(SELECT id,name FROM forum_categories) AS f2 ON f1.in_id = f2.id
Den då?
Citera
2009-10-29, 23:21
  #5
Medlem
Fortfarande ger den mig fel.. fast den här gången ger den mig "#1052 - Column 'id' in field list is ambiguous".

Kom på att jag kanske borde nämnt att jag använder MySQL 5
Citera
2009-10-29, 23:32
  #6
Moderator
Protons avatar
sätt f1.id, f1.name i den yttre SQL-en så borde det funka då?
Citera
2009-10-29, 23:38
  #7
Medlem
Tror jag fick den att fungera nu. Satte in * i båda select
Kod:
SELECT FROM forum_categories f1
LEFT JOIN
(SELECT FROM forum_categories) AS f2 ON f1.in_id f2.id 

Edit:
Märkte att den kanske inte riktigt fungerade som jag tänkt mig (kanske förklarade dåligt). Just nu får jag tillbaka alla rader i tabellen när jag kör den. Går det på något sätt att bara hämta ut kategorin med id:n säg 2 och de kategorier som den ligger i? Försökt med WHERE id = 2 i den yttre SELECT:en men det fungerade inte riktigt
__________________
Senast redigerad av verath 2009-10-29 kl. 23:44.
Citera
2009-10-29, 23:45
  #8
Moderator
Protons avatar
Såklart

Kod:
SELECT f1.id,f1.name FROM forum_categories f1 
LEFT JOIN 
(SELECT id,name FROM forum_categories) AS f2 ON f1.in_id = f2.id
WHERE f1.id = 2
Så borde det ju funka?
Citera
2009-10-29, 23:50
  #9
Medlem
Nu fungerar det perfekt, tack så mycket .
Citera
2009-10-29, 23:51
  #10
Moderator
Protons avatar
Äntligen! Som Gert Fylking hade sagt
Citera
2009-11-18, 00:54
  #11
Medlem
Hej, jag är ny på databaser och har några frågor utifrån den här frågan, hoppas att det går bra att jag kapar tråden lite.
Jag kan åtminstone bidra med något: Var det inte t2.name som verath var intresserad av att få ut ur queryn? Nåväl, han verkar nöjd iaf.

Till min fråga då, varför skriver man såhär:
Kod:
SELECT f1.id,f1.name FROM forum_categories f1 
LEFT JOIN 
(SELECT id,name FROM forum_categories) AS f2 ON f1.in_id f2.id
WHERE f1
.id 

istället för exempeelvis såhär:
Kod:
SELECT f1.id,f1.name 
FROM forum_categories f1
forum_categories f2 
WHERE f1
.id AND f1.in_id f2.id

alt

SELECT f1
.id,f1.name 
FROM forum_categories f1 INNER JOIN forum_categories f2 ON f1
.id AND f1.in_id f2.id 

Jag ser nu att (SELECT id,name FROM forum_categories) blir mindre än hela forum_categories och att man därmed kanske får en mindre jobbig join, men sköter inte sql optimiseringen sånt?

Vilket av sätten är att föredra eller har ni något annat förslag?
Citera
2009-11-18, 01:41
  #12
Moderator
Protons avatar
Anlednigen till att man inte använder den kartesiska produkten du talar om här är att den kommer endast ge dig de rader som går att "joina" ihop. Det innebär att man kommer att missa information, eftersom "rotnivån" inte har nån "parent" men likväl efterfågas det "en rotnod som har en parent" och en sådan finns ju inte, alltså kommer den inte att tas med.

LEFT JOIN å andra sidan kommer ge dej ALL data som finns till vänster om JOINen även om det inte finns nån rad till höger om JOINen som passar, vilket alltså inte är fallet med en INNER JOIN eller kartesisk produkt som du använde när du joinade i wherevillkoret, där det man JOINar på måste förekomma i bägge tabellerna för att man ska få med det i slutresultatet.

Personligen föredrar jag av sagda anledningar att använda mig av JOINS då jag har kontroll över hur tabeller joinas ihop och så slipper jag blöta ner wherevillkoren(som kan vara nog så långa utan att man ska behöva ha en join mitt i allt där) till skillnad från den enda JOIN-möjligheten man har i ett wherevillkor, dvs en INNER JOIN. Hur ska du till exempel kunna få till en LEFT JOIN i ett wherevillkor på ett lika smidigt sätt?
__________________
Senast redigerad av Proton 2009-11-18 kl. 01:44.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback