webForumDet fria alternativet

Count funkar inte om jag kör inner join?

8 svar · 407 visningar · startad av Melea

MeleaMedlem sedan juli 20033 147 inlägg
#1

Okai,

Tycker detta borde funka.

select 
	s.sprint_id,
	s.sprint_topic, 
	s.sprint_text, 
	date_format(s.sprint_date, '%e %b %Y, %H:%i') as sprint_date,
	s.sprint_user_id,
	s.sprint_sort_order as prio,
	count(s.sprint_id) as siblings,
	u.user_name
from 
	" . tbl_SPRINT . " s
left join
	" . tbl_USER . " u on s.sprint_user_id = u.user_id
group by
	s.sprint_id
order by
	s.sprint_sort_order

Men counten funkar inte, varför?
Använder MySQL 5.0.41.
Ledsen för den korta tonen, suttit alldeles för länge med det här.

Tack på förhand!

MeleaMedlem sedan juli 20033 147 inlägg
#2

Tycker det här är konstigt.

Detta funkar

select 
	s.sprint_id,
	s.sprint_topic, 
	s.sprint_text, 
	date_format(s.sprint_date, '%e %b %Y, %H:%i') as sprint_date,
	s.sprint_user_id,
	s.sprint_sort_order as prio,
	count(s.sprint_id) as siblings,
	u.user_name
from 
	" . tbl_SPRINT . " s 
join
	" . tbl_SPRINT . " s2
left join
	" . tbl_USER . " u on (s.sprint_user_id = u.user_id)
group by
	s.sprint_id
order by
	s.sprint_sort_order

s2 gör ju ingenting, hur kan det göra någon skillnad? Förklara gärna. :)

LarsGMedlem sedan dec. 200012 464 inlägg
#3

Vad menar du med att det inte fungerar?

MeleaMedlem sedan juli 20033 147 inlägg
#4

Säg att jag har 3 poster i tabellen tbl_SPRINT, i mitt första inlägg returnerar prio endast 1, i mitt andra 3.

/r okej, rubriken på första inlägget är helt tokfel, döpte inlägget när jag hade ett annat fel, sorry för det. :)

LarsGMedlem sedan dec. 200012 464 inlägg
#5

Hur är tabellerna definierade? Vilka kolumner utgör primärnyckel? Ge exempel på datainnehåll och förväntat resultat.

MeleaMedlem sedan juli 20033 147 inlägg
#6

sprint_id - int primärnyckel
sprint_topic - varchar
sprint_text - longtext
sprint_date - datetime
sprint_user_id - int
sprint_sort_order - int

Vill hämta allt innehåll i tbl_SPRINTS, samt information om användaren genom att jämföra sprint_user_id med user_id i tbl_USER-tabellen, och jag vill att prio ska innehålla antal poster i tbl_SPRINTS.

MeleaMedlem sedan juli 20033 147 inlägg
#7

Okej, såhär ser SQL-frågan ut nu:

select
	s.sprint_id,
	s.sprint_topic, 
	s.sprint_text, 
	date_format(s.sprint_date, '%e %b %Y, %H:%i') as sprint_date,
	s.sprint_user_id,
	s.sprint_completed,
	s.sprint_prio,
	s.sprint_sort_order as sort_order,
	count(s.sprint_id) as siblings,
	u.user_name
from 
	" . tbl_SPRINT . " s 
join
	" . tbl_SPRINT . " s2
left join
	" . tbl_USER . " u on s.sprint_user_id = u.user_id
where
	s.sprint_completed = #
group by
	s.sprint_id
order by
	s.sprint_sort_order

Det jag vill få ut är alla poster i tbl_SPRINT där sprint_completed är 0, 1 eller 2, beroende på vad den får för värde. Jag vill också räkna alla poster som den skriver ut, dvs de där sprint_completed är 0, 1 eller 2.

Just nu räknar counten alla poster, oavsett vad det står i where-satsen, men den skriver ut innehållet korrekt.

LarsGMedlem sedan dec. 200012 464 inlägg
#8

prio? Menar du inte siblings?

Om vi tittar på din första fråga och bara använder kolumner sprint_id
och säger att den har följande innehåll

sprint_id

1
2
3

select sprint_id, count(sprint_id)
  from tbl_Sprint
 group by sprint_id

så ger det resultatet

1 1
2 1
3 1

om du har frågan

select s.sprint_id,s2.sprint_id
  from tbl_Sprint s
  join tbl_sprint s2

så ger det resultatet

s.sprint_id s2.sprint_id

1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3

eftersom du kombinerar alla poster med alla poster i de båda tabellerna.

select s.sprint_id,count(s.sprint_id)
  from tbl_Sprint s
  join tbl_sprint s2
 group by s.sprint_id

så ger det resultatet

1 3
2 3
3 3

eftersom du har tre förekomster av varje s.sprint_id

Om du för varje rad i resultatet även vill ha totala antalet rader i tbl
så kan du skriva

select s.sprint_id,
       s.sprint_topic, 
       s.sprint_text, 
       date_format(s.sprint_date, '%e %b %Y, %H:%i') as sprint_date,
       s.sprint_user_id,
       s.sprint_sort_order as prio,
       (select count(*)  from tbl_sprint) as siblings,
       u.user_name
  from tbl_SPRINT s
  left join tbl_USER u on s.sprint_user_id = u.user_id
 order by s.sprint_sort_order

Grundproblemet är att mysql's implementation av group by tillåter sqlfrågor som inte är entydiga.

MeleaMedlem sedan juli 20033 147 inlägg
#9

Du är en klippa, som alltid.

select
	s.sprint_id,
	s.sprint_topic, 
	s.sprint_text, 
	date_format(s.sprint_date, '%e %b %Y, %H:%i') as sprint_date,
	s.sprint_user_id,
	s.sprint_completed,
	s.sprint_prio,
	s.sprint_sort_order as sort_order,
	(select count(*)  from " . tbl_BACKLOG . " where backlog_completed = :backlog_completed) as siblings,
	u.user_name
from 
	" . tbl_SPRINT . " s 
left join
	" . tbl_USER . " u on s.sprint_user_id = u.user_id
where
	s.sprint_completed = :backlog_completed
order by
	s.sprint_sort_order

Funkar klockrent! :bire

132 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)