MySQL

Активист

Активист
Команда форума
Нужно вытянуть в одном запросе всего зарегистрированных пользователей на семинар и тех, которые ожидают проверки регистрации (джойн дважды одной таблицы по параметрам)
Код:
SELECT 
		`seminars`.*,
		COUNT(`seminarsReg`.`userId`) AS `count`,
		GROUP_CONCAT(`seminarsReg`.`userId`) AS `userIds`,
		COUNT(`seminarsReg_wait`.`userId`) AS `wait_count`

FROM
		`seminars`

LEFT JOIN
		`seminarsReg` ON `seminarsReg`.`seminarId` = `seminars`.`seminarsId`
LEFT JOIN
		`seminarsReg` AS `seminarsReg_wait` ON `seminarsReg_wait`.`seminarId` = `seminars`.`seminarsId` && `seminarsReg_wait`.`status` = 'wait'
GROUP BY
		`seminars`.`seminarsId`
ORDER BY
		`position`
Проблема в том, что `count` содержит значение 4, хотя всего пользователей зарегистрированных 2.
Как сделать правильно?
 

zerkms

TDD infected
Команда форума
Правильно - убрать GROUP BY (и все агрегатные функции) и посмотреть, что же действительно лежит в `seminarsReg_wait`.`userId`
 

Активист

Активист
Команда форума
Да, тупняк какой-то у меня с этой темы, я проверял.

Код:
SELECT 
		`seminars`.`seminarsId`,
		`seminarsReg`.*,
		`seminarsReg_wait`.*
FROM
		`seminars`
LEFT JOIN
		`seminarsReg` ON `seminarsReg`.`seminarId` = `seminars`.`seminarsId`
LEFT JOIN
		`seminarsReg` AS `seminarsReg_wait` ON `seminarsReg_wait`.`seminarId` = `seminars`.`seminarsId` && `seminarsReg_wait`.`status` = 'wait'
ORDER BY
		`position`
Код:
mysql> SELECT `seminars`.`seminarsId`, `seminarsReg`.*,`seminarsReg_wait`.* FROM `seminars` LEFT JOIN  `seminarsReg` ON `seminarsReg`.`seminarId` = `seminars`.`seminarsId` LEFT JOIN `seminarsReg` AS `seminarsReg_wait` ON `seminarsReg_wait`.`seminarId` = `seminars`.`seminarsId` && `seminarsReg_wait`.`status` = 'wait' ORDER BY `position`;
+------------+-----------+--------+--------+------------+-----------+--------+--------+------------+
| seminarsId | seminarId | userId | status | reg        | seminarId | userId | status | reg        |
+------------+-----------+--------+--------+------------+-----------+--------+--------+------------+
|          2 |      NULL |   NULL | NULL   | NULL       |      NULL |   NULL | NULL   | NULL       |
|          1 |         1 |      1 | wait   | 2010-12-09 |         1 |      1 | wait   | 2010-12-09 |
|          1 |         1 |      1 | wait   | 2010-12-09 |         1 |     13 | wait   | 2010-12-10 |
|          1 |         1 |     13 | wait   | 2010-12-10 |         1 |      1 | wait   | 2010-12-09 |
|          1 |         1 |     13 | wait   | 2010-12-10 |         1 |     13 | wait   | 2010-12-10 |
|          3 |      NULL |   NULL | NULL   | NULL       |      NULL |   NULL | NULL   | NULL       |
|          4 |      NULL |   NULL | NULL   | NULL       |      NULL |   NULL | NULL   | NULL       |
|          5 |      NULL |   NULL | NULL   | NULL       |      NULL |   NULL | NULL   | NULL       |
|          6 |      NULL |   NULL | NULL   | NULL       |      NULL |   NULL | NULL   | NULL       |
|          7 |      NULL |   NULL | NULL   | NULL       |      NULL |   NULL | NULL   | NULL       |
|          8 |      NULL |   NULL | NULL   | NULL       |      NULL |   NULL | NULL   | NULL       |
|          9 |      NULL |   NULL | NULL   | NULL       |      NULL |   NULL | NULL   | NULL       |
|         10 |      NULL |   NULL | NULL   | NULL       |      NULL |   NULL | NULL   | NULL       |
+------------+-----------+--------+--------+------------+-----------+--------+--------+------------+


Код:
mysql> show create table `seminarsReg`\G
*************************** 1. row ***************************
       Table: seminarsReg
Create Table: CREATE TABLE `seminarsReg` (
  `seminarId` int(10) unsigned NOT NULL,
  `userId` int(10) unsigned NOT NULL,
  `status` enum('wait','ok','drop') default NULL,
  `reg` date default NULL,
  PRIMARY KEY  (`seminarId`,`userId`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
1 row in set (0.00 sec)
mysql>
Как заджойнить? ну или вообще, сделать ))
 

chira

Новичок
тебе не нужно два LEFT JOIN
если нужно посчитать, сколько со статусом wait, то посчитай их примерно так:
Код:
SELECT  `seminars`.*,
		COUNT(`seminarsReg`.`userId`) AS `count`,
		GROUP_CONCAT(`seminarsReg`.`userId`) AS `userIds`,
		COUNT(IF(`seminarsReg`.`status` = 'wait',1,NULL)) AS `wait_count`
FROM `seminars`
LEFT JOIN `seminarsReg` ON `seminarsReg`.`seminarId` = `seminars`.`seminarsId`
GROUP BY `seminars`.`seminarsId`
ORDER BY `position`
 

zerkms

TDD infected
Команда форума
chira
Тупо любопытно, что твой вопрос дополнил к моему ответу? :) Считаешь, что ТС не понял моего ответа? :)))
 

chira

Новичок
zerkms
Я ещё не привык к новому дизайну и твой ответ затерялся в списке постов, ты молодец! Для TC должно было хватить твоего ответа. :)
 
Сверху