Подсчет дочерней таблицы с внешним ключом, несколько раз, с условием - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть две таблицы:

  1. Метки -> идентификатор, имя, описание, пользователь, статус
  2. Label_connection.-> id, Label_id, category

Итак, существует несколько категорий, скажем, 1 => new, 2 => old.

Мне нужно количество дочерней таблицы в соответствии скатегория.

Это то, что у меня сейчас есть,

SELECT `L`.*, COUNT(DISTINCT LC1.id) as count1, COUNT(DISTINCT LC2.id) as count2 
FROM (`Labels` L) 
LEFT JOIN `Label_connection` LC1 ON `LC1`.`Label_id` = `L`.`id` AND LC1.categories = "1" 
LEFT JOIN `Label_connection` LC2 ON `LC2`.`Label_id` = `L`.`id` AND LC2.categories = "2" 
WHERE `L`.`status` = '0' AND `L`.`user` = 1
GROUP BY `L`.`id` 
ORDER BY `L`.`id` DESC 
LIMIT 20

Это действительно дает мне счет правильно, но я обеспокоен множественными объединениями, так как количество категорий будет идтиup.

Если кто-нибудь может улучшить это, я был бы благодарен,

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Для условного агрегирования вы также можете использовать COUNT DISTINCT .. CASE..WHEN..END.

Кроме того, ваш текущий запрос недействителен GROUP BY (если L.id не является первичным ключом).Подробнее см .: Ошибка, связанная с only_full_group_by при выполнении запроса в MySql

Также, пожалуйста, предпочитайте использовать одинарные кавычки SQL-Standard вокруг строковых литералов вместо двойных кавычек.

SELECT L.id,  
       COUNT(DISTINCT CASE WHEN LC.categories = '1' THEN LC.id END) AS count1, 
       COUNT(DISTINCT CASE WHEN LC.categories = '2' THEN LC.id END) AS count2 
FROM Labels AS L
LEFT JOIN Label_connection AS LC 
  ON LC.Label_id = L.id
WHERE L.status = '0' AND
      L.user = 1
GROUP BY L.id 
ORDER BY L.id DESC 
LIMIT 20
0 голосов
/ 01 декабря 2018

Вы можете попробовать записать его как один JOIN с условным агрегированием:

SELECT `L`.*
     , SUM(CASE WHEN LC.categories = "1" THEN 1 END) as count1
     , SUM(CASE WHEN LC.categories = "2" THEN 1 END) as count2
FROM `Labels` L
LEFT JOIN `Label_connection` LC ON `LC`.`Label_id` = `L`.`id`
WHERE `L`.`status` = '0' AND `L`.`user` = 1
GROUP BY `L`.`id` 
ORDER BY `L`.`id` DESC 
LIMIT 20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...