Всем добра! Кто хочет прокачать скилл? У меня и у гугла не хватает знаний. Помогите, пожалуйста Есть три таблицы. 1 - users 2 - blue 3- red Нужно выбрать количество упоминаний пользователей всего из двух таблиц. т.е. count (какой-то), имя из users и дату из users. Я пробовал так: Спойлер: ужс Код (Text): SELECT *,count(*) as numgames, users.user FROM blue LEFT JOIN users ON blue.user_id = users.id LEFT JOIN red ON red.id = users.id GROUP BY _blue.user_id, red.user_id ORDER BY numgames DESC ------ SELECT A.user_id ,T.user_id ,count(*) AS TotalAmount FROM red AS A LEFT JOIN blue AS T ON T.user_id = A.user_id GROUP BY A.user_id,T.user_id ------ select c.user_id,r.user_id, (select user from users_001 WHERE r.user_id = users.id ) user, (select date_reg from users_001 WHERE r.user_id = users.id ) date_reg, (select id from users_001 WHERE r.user_id = users.id ) user_id, count(*) as numgames bets_blue c join red r on c.user_id=r.user_id group by c.user_id,r.user_id order by numgames DESC Результат всегда ужасный. У ID = 30 максимум до 100 должно быть. Спасибо всем кто откликнется!
Спойлер: DB Код (Text): CREATE TABLE `users` ( `id` int(11) NOT NULL, `user` varchar(50) NOT NULL, `email` varchar(50) NOT NULL, `pass` varchar(80) CHARACTER SET utf8 NOT NULL, `date_reg` int(11) NOT NULL DEFAULT 0, `date_login` int(11) NOT NULL DEFAULT 0 ) ENGINE=InnoDB DEFAULT CHARSET=cp1251; --- CREATE TABLE `blue` ( `id` int(11) NOT NULL, `game_id` int(11) NOT NULL, `user_id` int(11) NOT NULL, `login` varchar(40) NOT NULL, `color` varchar(10) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT; ---- CREATE TABLE `red` ( `id` int(11) NOT NULL, `game_id` int(11) NOT NULL, `user_id` int(11) NOT NULL, `login` varchar(40) NOT NULL, `color` varchar(10) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT; Вася - ID 97 - упомянут в обеих таблицах 123 раза Петя - ID 45 - упомянут в обеих таблицах 67 раз Коля - ID 67 - упомянут в обеих таблицах 45 раз Даша - ID 89 - упомянут в обеих таблицах 12 раз НО! Вася может быть только в blue или red. Не обязательно что пользователь есть и там и там.
https://www.db-fiddle.com/f/4zar45u3igwAdtuj88xtJM/4 --- Добавлено --- Но при этом необходимо помнить, что это все же не одно и то же, что и оператор JOIN
Код (Text): SELECT CONCAT(`users`.`user`, ' - ID ' , `t1`.`user_id`, ' упомянут в обеих таблицах ', count(`t1`.`user_id`), ' раз') FROM (SELECT * FROM `blue` UNION SELECT * FROM `red`) AS `t1` JOIN `users` ON `users`.`id` = `t1`.`user_id` GROUP BY `t1`.`user_id`
Так-то всё просто. Спойлер Код (SQL): SELECT user_id, SUM(cnt) FROM ( SELECT COUNT(user_id) AS cnt, user_id FROM blue GROUP BY user_id UNION SELECT COUNT(user_id) AS cnt, user_id FROM red GROUP BY user_id ) AS subq GROUP BY user_id;
Нет предела совершенству Надо просто добавить в перечень group by поле, которое участвует в выборке. (...GROUP BY `t1`.`user_id`, `users`.`user`) Группировка - она такая. Часто содержимое полей, не участвующих в группировке неоднозначно. Реакция на подобную ситуацию зависит от настроек сервера СУБД.
Как вам выше написали группировка имеет свои особенности. Откройте базу в phpMyadmin и отлаживайте SQL в нем. Нет никаких проблем с сортировкой Код (Text): SELECT `users`.`user`, `t1`.`user_id`, count(`t1`.`user_id`) as `count` FROM (SELECT * FROM `blue` UNION SELECT * FROM `red`) AS `t1` JOIN `users` ON `users`.`id` = `t1`.`user_id` GROUP BY `t1`.`user_id` ORDER BY `users`.`user` ASC