2013-10-04 3 views
4

Здравствуйте я имею таблицу, похожую на эту:mysql select в другой группе: сколько людей в нижнем листе?

id  sponsor  name 
------------------------ 
1  0   Sasha 
2  1   John 
3  1   Walter 
4  3   Ashley 
5  1   Mark 
6  4   Alexa  
7  3   Robert 
8  3   Frank 
9  4   Marika 
10  5   Philip 
11  9   Elizabeth 

, когда я выбираю идентификатор (назовем его MyChoice) Я хочу знать все названия людей, который спонсируют как MyChoice ... просто:

выберите * от имя_таблицы где спонсор = MyChoice

но ... вот это проблема ... я бы знать, сколько людей там в даунлайнерах это приводит ... так .. . Сколько записей есть у спонсора, такого как eac h id.

если я выбрать идентификатор 1 результат должен быть

id name  downline 
---------------------- 
2 John  0    (noone with sponsor=2) 
3 Walter 3    (3 with sponsor=3: ashley, robert, frank) 
5 Mark  1    (1 with sponsor=5: philip) 

если я выбрать идентификатор 4 результат должен быть

id name  downline 
---------------------- 
6 Alexa 0 
9 Marika 1 (1 with sponsor=9: Elizabeth) 

я попробовать это "плохое решение", если MyChoice является 1

выберите спонсора, счетчик (*), как внизу, из tablename, где спонсор: (выберите id из tablename, где sponsor = 1) group by sponsor ord э по нижестоящих по алфавиту

результат этого запроса

sponsor downline 
--------------------- 
3  3 
5  1 

есть 2 проблемы: - имена не права и не то, что я хочу - счетчик 0 «2 | Джон | 0" в примере DonT появляется

поблагодарить у за советом и помощью, извините за английский, Н.

+0

вы должны использовать левое внешнее соединение, чтобы сделать это – bksi

ответ

3
SELECT child.id, 
     child.name, 
     COUNT(grandchild.sponsor) downline 
FROM TableName child 
     INNER JOIN TableName parent 
      ON child.sponsor = parent.id AND 
       parent.id = ?    -- << user choice 
     LEFT JOIN TableName grandchild 
      ON child.id = grandchild.sponsor 
GROUP BY child.id, child.name 

Как вы можете видеть, таблица присоединяется к себе в два раза. Первое соединение, которое использует INNER JOIN, получает записи, связанные с Sponsor, который является вашим user_choice. Второе соединение, которое использует LEFT JOIN, получает все записи, связанные с записями от вашего user_choice.

+0

OMG u r a genius! Большой! это работает! 10Q user # 491243 :)) Я очень счастлив снова tnx – JoTaRo

Смежные вопросы