BG Development


  Reply to this topicStart new topicStart Poll

> MySQL select join multiple table and SUM
TrustHavic
Публикувано на: 28-11-2017, 20:38
Quote Post



Име: Станимир
Група: Потребител
Ранг: Редовен член

Мнения: 369
Регистриран на: 30.04.14



Имам следната заявка. Целта е да извадя данни от различни таблици, който да продредя в таблица/графика за всеки ред от `users`. Проблема е че 1) не вади правилен резултат, 2)не винаги това което го има в task(като потребители) го има и в `calendar`, 3) трябва да изкарам информацията за определен период от време (във всяка от таблиците към всеки ред има и datetime колона)
Стигнах до тук, но не работи правилно с два join-a, а може би и повече(със сигурност ще се наложи за напред)
SQL
SELECT
CONCAT(u.name,' ',u.family) as bName,
u.id, COUNT( * ) AS `total` ,
SUM(CASE WHEN (t.type = '1' AND t.status = '1') THEN 1 ELSE 0 END ) active,
SUM(CASE WHEN (t.type = '2' AND t.status = '1') THEN 1 ELSE 0 END ) unActive,
SUM(CASE WHEN c.status = '1' THEN 1 ELSE 0 END ) inspections
FROM `users` u
JOIN task t ON u.id = t.bid
JOIN `calendar` c ON u.id = c.bid
GROUP BY u.id


PMEmail Poster
Top
TrustHavic
Публикувано на: 29-11-2017, 00:43
Quote Post



Име: Станимир
Група: Потребител
Ранг: Редовен член

Мнения: 369
Регистриран на: 30.04.14



Мисля че сам намерих решение на проблема
SQL
SELECT
CONCAT(u.name,' ',u.family) as bName, c.x, t.y, tx.z
FROM users u
LEFT JOIN (SELECT bid, COUNT(*) x FROM `calendar` WHERE `status` = '1' GROUP BY bid) c ON u.id = c.bid

LEFT JOIN (select bid, count(*) y FROM task WHERE `status` = '1' and `type` = '1' GROUP BY bid) t ON u.id = t.bid

LEFT JOIN (select bid, count(*) z FROM task WHERE `status` = '1' and` type` = '2' GROUP BY bid) tx ON u.id = tx.bid

ORDER BY name ASC
PMEmail Poster
Top
Arruor
Публикувано на: 16-02-2018, 17:29
Quote Post



Име: Димитър Ников
Група: Потребител
Ранг: Новопостъпил

Мнения: 20
Регистриран на: 22.06.05



Може да тестваш и този вариант
CODE

SELECT
   CONCAT_WS(' ', u.name, u.family) AS bName,
   u.id,
   COUNT(*) AS `total`,
   (SELECT SUM(1) FROM task t WHERE t.type = 1 AND t.status = 1 AND t.bid = u.id) AS active,
   (SELECT SUM(1) FROM task t WHERE t.type = 2 AND t.status = 1 AND t.bid = u.id) AS unActive,
   (SELECT SUM(1) FROM calendar c WHERE c.status = 1 AND c.bid = u.id) AS inspections
FROM users u

GROUP BY u.id


Все пак зависи и от payload-а, който имаш. За всеки случай си провери вариантите с EXPLAIN.

Поздрави,


--------------------
Петилетните планове трябва да бъдят изпълнявани за 3 години ...

As Agent Smith say : "Evolution, Morpheus, Evolution !!!”.

There are only 10 kind of people - those who knows binary, and those who don't

Lamers, I have an eye of you ...
PMEmail PosterICQ
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0