Just nu i M3-nätverket
Jump to content

Hjälp med en sql-sats


Haren

Recommended Posts

Hej.

 

Jag håller på att koda ett enkelt forum. I en lista ska inlägg listas tillsammans med lite info, bland annat datum, användare och antal inlägg från användarna som skrivit inläggen som listas.

 

Det är att få ut antal inlägg av en viss användare som är svårt!

 

Min amatörmässiga SQL-sats ser ut så här:

 

SELECT T.ARENDE, I.INLAGGID, I.ANVANDARID, I.MEDDELANDE, I.TID, (SELECT COUNT(A.ANVANDARID) FROM ANVANDARE A, INLAGG I WHERE I.ANVANDARID = A.ANVANDARID) AS ANTAL FROM TOPIC T, INLAGG I WHERE T.TOPICID = 8 AND I.TOPICID = T.TOPICID

 

Detta ger en lista med inlägg, alla data stämmer utom den speciella kolumnen ANTAL som alltid blir samma. Där vill jag ju ha antal inlägg som radens användare har skrivit.

 

Det är nog jättesimpelt det här, men jag går lätt vilse i SQL-syntaxen.

 

Tacksam för hjälp!

PS: Säg till om jag måste förtydliga mitt tänk! DS

 

-------------------------------

/HAREN

"And never start a sentence with a conjunction"

 

 

 

Link to comment
Share on other sites

Prova

 

SELECT T.ARENDE, I.INLAGGID, I.ANVANDARID, I.MEDDELANDE, I.TID, count(*) as antal

 

FROM TOPIC T, INLAGG I WHERE T.TOPICID = 8 AND I.TOPICID = T.TOPICID

 

group by T.ARENDE, I.INLAGGID, I.ANVANDARID, I.MEDDELANDE, I.TID

 

 

Hälsningar Håkan A

 

Link to comment
Share on other sites

Nja, det där kommer väl alltid returnera 1 som antal?

 

Jag antar att han vill ha antalet totala inlägg i hela forumet för användaren.

 

Testa då med:

 

group by I.ANVANDARID

 

...om jag inte missförstått frågan....

 

 

_________

TicoRoman - The One And Only

 

Link to comment
Share on other sites

Ja, det stämmer att jag vill ha totala antalet inlägg i hela forumet för användarna.

 

Hmm, hur skulle hela frågan se ut sedan i så fall?

 

Testade detta, fast fick massa fel:

 

SELECT T.ARENDE, I.INLAGGID, I.ANVANDARID, I.MEDDELANDE, I.TID, count(*) as antal FROM TOPIC T, INLAGG I WHERE T.TOPICID = 8 AND I.TOPICID = T.TOPICID group by I.ANVANDARID

 

felen var:

Column 'T.ARENDE' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

 

...och samma fel för I.INLAGGID, I.MEDDELANDE och I.TID.

 

 

-------------------------------

/HAREN

"And never start a sentence with a conjunction"

 

 

 

[inlägget ändrat 2003-03-26 22:39:37 av Haren]

Link to comment
Share on other sites

Ingen som kan hjälpa mig ytterligare med detta problem?

 

-------------------------------

/HAREN

"And never start a sentence with a conjunction"

 

 

 

Link to comment
Share on other sites

Du måste ha med alla de fält du vill visa efter GROUP BY:

 

SELECT T.ARENDE, I.INLAGGID, I.ANVANDARID, I.MEDDELANDE, I.TID, count(*) as antal FROM TOPIC T, INLAGG I WHERE T.TOPICID = 8 AND I.TOPICID = T.TOPICID group by I.ANVANDARID, I.INLAGGID, I.MEDDELANDE, I.TID, T.ARENDE

 

Men det kommer nog fortfarande att returnera 1. Jag tror inte det går att lösa med en sql-fråga. Du får nog dela upp det på två frågor

 

SELECT Count(i.anvandarid) AS Antal FROM i GROUP BY i.anvandarid

 

[inlägget ändrat 2003-03-27 20:34:17 av Mr Orange]

Link to comment
Share on other sites

Mikael Ericsson

Testa med en subquery.

Det funkar i MSSQL; du skriver inte vilken databas du kör.

 

Ett simpelt exempel:

 

select t1.falt1, t2.antal, t2.falt3 from tabell1 t1

left join

(

select falt3, count(*) as antal from tabell1

group by falt3

) as t2

on t1.falt1=t2.falt1

 

Du kommer att få NULL som resulat av subqueryn om poster saknas.

 

 

Link to comment
Share on other sites

Tack för förslaget. Jag kör MS SQL Server. Jag försökte nu testa detta efter eget huvud på mitt problem och fick följande sql-fråga.

 

select i.topicid, i.anvandarid, i.meddelande, i.tid, sub.antal from inlagg i

left join

(

select t.topicid, i.anvandarid, count(*) as antal from inlagg i, topic t group by i.anvandarid, t.topicid

) as sub

on i.topicid = sub.topicid and i.topicid = 10

 

Problemet är att jag nu får dels rader som hör till "fel" topicid, och dessutom får jag alla rader två gånger. Har jag tänkt fel någonstans?

 

-------------------------------

/HAREN

"And never start a sentence with a conjunction"

 

 

 

[inlägget ändrat 2003-03-30 17:57:34 av Haren]

Link to comment
Share on other sites

Jo, jag tänkte också på att dela upp det i två frågor, men det är ju så att satsen returnerar en lista, som jag petar in i en datareader i .NET ... så jag måste på nåt vis för varje rad få med den där kolumnen.

 

-------------------------------

/HAREN

"And never start a sentence with a conjunction"

 

 

 

Link to comment
Share on other sites

Jag tror att du ska ta bort t.topicid i den andra selecten och i group by.

 

Förslag:

 

select i.topicid, i.anvandarid, i.meddelande, i.tid, sub.antal from inlagg i

left join

(

select i.anvandarid, count(*) as antal from inlagg i, topic t group by i.anvandarid

) as sub

on i.topicid = sub.topicid and i.topicid = 10

 

 

Link to comment
Share on other sites

Tack för förslaget och försöket, men jag måste ha med topicid i den andra selecten, eftersom den utgör en "tabell" kallad sub där ju topicid måste ingå, i och med uttrycket i.topicid = sub.topicid.

 

*suck*... det känns som att jag har prövat allt... måste jag anse mig som besegrad?

 

 

-------------------------------

/HAREN

"And never start a sentence with a conjunction"

 

 

 

Link to comment
Share on other sites

Ge inte upp nu :-). Man kan ju fuska lite. Lägg till en kolumn ETT som alltid får värdet = 1.

 

select

i.topicid, i.anvandarid, i.meddelande, i.tid,

sum(i.ETT)

from

inlagg i, topic t

where

i.topicid = t.topicid and

i.topicid = 10

group by

i.topicid,i.anvandarid, i.meddelande, i.tid

 

Detta borde ge en lista med summa antal för varje kombination topic, användare, meddelande, tid. Om det nu är det du vill ha.

 

Det finns säkert snyggare sätt... :-)

 

 

Link to comment
Share on other sites

Tack för tipset, men det där gav bara värdet 1 i kolumnen där det skulle summeras. I och för sig stämmer det att jag får summa antal för varje kombination topic, användare, meddelande, tid.

 

Jag är inte säker på att jag förklarat tillräckligt bra vad mitt problem är.

 

I kolumnen för antal vill jag ha det antal inlägg som varje användare har gjort. Här är ett exempel på hur det kan se ut om jag ville lista ALLA inlägg oavsett topic (punkterna är bara där för formattering).

INLAGGID..TOPICID..ANVANDARID..MEDDELANDE..ANTAL
1.........1........Haren.......Hej på er!..2
2.........2........Haren.......Bla bla.....2
3.........2........Freja.......Blablal.....1

 

Som du ser vill jag på varje rad få det antal inlägg som just denna skribent totalt skrivit i forumet (t ex Haren har 2 inlägg totalt).

 

 

-------------------------------

/HAREN

"And never start a sentence with a conjunction"

 

 

 

[inlägget ändrat 2003-04-01 15:18:16 av Haren]

Link to comment
Share on other sites

Haren. Jag har nu experimenterat lite med en egen databas. Översatt till ditt problem så funkar KANSKE detta:

 

select

i.anvandarid, i.topicid, i.meddelande, i.tid, sub.antal

from

inlagg i

right join

(

select anvandarid, count(*) as antal from inlagg where topicid = 10 group by anvandarid

) as sub

on i.topicid = sub.topicid

 

 

 

Link to comment
Share on other sites

Hej!

 

Det var väldigt snällt av dig att orka testa med en egen databas! =)

 

Tyvärr är det fortfarande problem, den hittar ju inte sub.topic eftersom den inte selectas i sub (ehm, glasklart?) ... och lägger jag dit den så blir det något vaj på själva selecteringen. Jag landar på denna fråga:

 

select i.anvandarid, i.topicid, i.meddelande, i.tid, sub.antal
from
inlagg i
right join
(
select t.topicid, i.anvandarid, count(*) as antal from inlagg i, topic t where i.topicid = 10 group by i.anvandarid, t.topicid
) as sub
on i.topicid = sub.topicid

 

Vilket tydligen listar samtliga inlägg (oavsett topic) och dessutom ger fel antal.

 

Lessen att det fortfarande inte funkar trots din generösa hjälp. Nu börjar det bli dags att ge upp kanske...

 

-------------------------------

/HAREN

"And never start a sentence with a conjunction"

 

 

 

Link to comment
Share on other sites

Tack än en gång för all hjälp, jag lyckades få ordning på det nu. Om du är nyfiken, så var svaret:

 

SELECT I.INLAGGID, T.ARENDE, I.INLAGGID, I.ANVANDARID, I.MEDDELANDE, I.TID, 
(SELECT count(*) FROM INLAGG M1 Where M1.ANVANDARID=I.ANVANDARID) as ANTAL 
FROM TOPIC T, INLAGG I 
WHERE T.TOPICID = 10 AND I.TOPICID = T.TOPICID 
group by I.ANVANDARID, I.INLAGGID, I.MEDDELANDE, I.TID, T.ARENDE, I.INLAGGID

 

Tack ändå, du får poäng. =)

 

-------------------------------

/HAREN

"And never start a sentence with a conjunction"

 

 

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...