Sql Колькасць: прымаючы колькасць радкоў, якія вядуць у 2 табліцы

Дапусцім, у мяне ёсць 2 табліцы Майстар і раб. Асноўная табліца змяшчае master_name і master_id, Вядзёная табліца мае Slave_id, slave_name і master_id.

ўзор дадзеных.

master_id Master_name  Master_status      slave_id  slave_name  master_id status
1         x               online              1          a          1       online
2         y               online              2          b          1       online
3         z               offline             3          c          2       offline
                                              4          d          3       offline
                                              5          e          3       online

чаканы вынік я спрабую атрымаць гэта,

master_id  no_of_slave
   1             2
   2             0

я хачу, каб атрымаць NO: онлайн рабоў кожны онлайн майстры маюць.

прабачце за несвоечасовыя рэдагавання.

1
Якія СКБД? Якія вашы думкі па гэтай праблеме пад рукой?
дададзена аўтар hd1, крыніца

7 адказы

Выкарыстоўвайце LEFT JOIN як гэты:

SELECT m.master_id
     , count(s.slave_id) AS no_of_slave
FROM master m 
LEFT JOIN slave s 
     ON m.master_id = s.master_id
GROUP BY m.master_id;

Вынік:

╔═══════════╦═════════════╗
║ MASTER_ID ║ NO_OF_SLAVE ║
╠═══════════╬═════════════╣
║         1 ║           2 ║
║         2 ║           1 ║
║         3 ║           2 ║
╚═══════════╩═════════════╝

Глядзіце гэтую SQLFiddle

5
дададзена
Я мог бы прапанаваць LEFT JOIN вярнуць гаспадарам без рабоў.
дададзена аўтар Taryn, крыніца
@bluefeet - Ды лепш. Абноўлена.
дададзена аўтар hims056, крыніца
дзякуй .... :) гэта працуе
дададзена аўтар iml3g3nd, крыніца

Выкарыстоўвайце прыведзены ніжэй запыт:

Select m.master_id, count(s.master_id) as no_of_slave 
       FROM master m 
            JOIN slave s 
            ON m.master_id = s.master_id
            GROUP By m.master_id;
1
дададзена
select    master_id, count(1)
from      Slave
group by  master_id
order by  master_id

будзе проста даць вам майстар, якія маюць раб, і вам нават не трэба ўступаць з гаспадаром, калі табліцы вялікія

0
дададзена
select 
    a.master_id,
    count(b.slave_id) 
from 
    master a,
    slave b 
where 
     a.master_id=b.master_id 
group by 
     a.master_id
0
дададзена
Чаму вы карыстаецеся коскай для аб'яднання табліц? Чаму не ANSI стандартнага сінтаксісу з JOIN?
дададзена аўтар Taryn, крыніца
Калі ласка, прачытайце
дададзена аўтар Taryn, крыніца
Калі вы заўсёды карыстаецеся правільнае далучаецца на некалькіх аб'яднанняў, чаму б не выкарыстоўваць гэта ўвесь час?
дададзена аўтар Taryn, крыніца
Гэта разважанне ИМО не мае сэнсу. Акрамя таго, калі ОП хоча вярнуць усе майстры нават без рабоў, г.зн. LEFT JOIN вы б пераключыцца на правільны сінтаксіс ANSI?
дададзена аўтар Taryn, крыніца
Іма коскай лягчэй чытаць для невялікіх злучэнняў і яны працуюць амаль усюды як сінонім далучаецца.
дададзена аўтар Markus Mikkolainen, крыніца
так, але <�я> for_small_joins , для некалькіх аб'яднанняў або складаныя злучэнні я заўсёды выкарыстоўваю правільны сінтаксіс аб'яднання.
дададзена аўтар Markus Mikkolainen, крыніца
Як я ўжо казаў, для невялікіх аб'яднанняў (як у простых, а не «некалькі радкоў»), яны больш чытэльным.
дададзена аўтар Markus Mikkolainen, крыніца
ofcourse.That чаму я прагаласаваў каментар вышэй ўверх.
дададзена аўтар Markus Mikkolainen, крыніца

Вы можаце выкарыстоўваць гэта. Гэта будзе працаваць.

select m.master_id,(select count(*) from slave s where s.master_id = m.master_id) as no_of_slave from master m
0
дададзена

Вы не зацікаўленыя ў майстар імёнаў так далучыцца не патрабуецца, у вас ёсць усе неабходныя дадзеныя ў табліцы рабагандлю:

select master_id, count(slave_id) as no_of_slave
from Slave
group by master_id
order by master_id --remove this line, if ordering of master ids is not important
;

Калі дадзены майстар-ідэнтыфікатар не ў гэтым выніку, гэта азначае, што ён не мае рабоў.

0
дададзена
  SELECT master_id, count(*) AS no_of_slave
    FROM slave
GROUP BY master_id
ORDER BY master_id;
0
дададзена