#mysql #count #distinct
#mysql #подсчет #distinct
Вопрос:
У меня есть таблицы «шаблон» и «объект» в соотношении один ко многим. Мне нужно знать, сколько «объектов» используют один и тот же «шаблон».
Это достаточно просто, но в таблице объектов есть два столбца: «тема» и «активный».
Мне нужно добавить в мой запрос, чтобы вернуть количество:
- Сколько объектов используют один и тот же шаблон.
- и имеют разные ‘object.active’ (active имеет логическое значение и никогда не имеет значения null)
- (поэтому, если есть три объекта, совместно использующие один и тот же шаблон, тогда количество не будет увеличиваться)
- и имеют разные object.theme (‘theme’ — это varchar и может быть null)
- ‘theme’ будет иметь значение, только если object.active имеет значение true
- исключение нулевого объекта.темы
Моя самая большая проблема заключается в том, что если ‘object.active’ все имеют одинаковое значение ‘1’ или ‘0’, то оно не должно добавляться к подсчету, но если все они имеют одинаковое значение ‘1’ и у каждого разные object.theme, то их нужно добавить к подсчету.
Пока я нахожусь на следующем, но при прохождении вручную и подсчете, какой должна быть цифра, я получаю неверный результат:
SELECT sum(tmpUse) FROM(
SELECT COUNT(*) AS tmpUse,tmp.title FROM templates tmp
LEFT JOIN assessmentinstances ai ON ai.template_id = tmp.id
GROUP BY tmp.id
HAVING tmpUse>1
AND COUNT(DISTINCT ai.data_theme)>1
AND COUNT(DISTINCT ai.mobile_ready)>1
) alias
template table
_____
| id |
-----
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
-----
object table
____________________________________
| id | template_id | active | theme |
|-----|-------------|--------|--------|
| a | 1 | 0 | null |
| b | 1 | 1 | x |
| c | 1 | 1 | y |
| d | 3 | 1 | x |
| e | 3 | 0 | null |
| f | 1 | 1 | z |
| g | 2 | 1 | z |
| h | 2 | 0 | null |
| i | 4 | 1 | y |
| j | 5 | 1 | z |
| k | 1 | 1 | x |
| l | 1 | 0 | null |
| m | 1 | 0 | null |
| n | 3 | 0 | null |
| o | 3 | 1 | x |
|-------------------------------------|
Я надеюсь, что результат из этих таблиц будет:
id count
1 3
2 1
3 1
4 0
5 0
= 5
- Идентификатор шаблона 1 содержит 7 объектов, объекты включают как 0, так и 1 актив, поэтому посмотрите на темы. связанные темы следующие: null, x, y, z, x, null, null. Мы игнорируем нули и дубликаты, поэтому это добавит 3 к количеству.
- Идентификатор шаблона 2 имеет 2 объекта, один из которых активен 1, а другой 0, поскольку это разные, но только одна отдельная тема, мы можем добавить 1 к количеству.
- Идентификатор шаблона 3 имеет 2 активных 1 и два активных 0, поэтому мы знаем, что по крайней мере один будет добавлен к счетчику. глядя на их темы, они одинаковы, поэтому подсчета больше нет, поэтому для идентификатора шаблона 3 добавляется только 1.
- Идентификаторы шаблонов 4 и 5 имеют один объект, поэтому мы знаем, что это не увеличит количество.
таким образом, результат запроса будет:
‘5’
Комментарии:
1. Можете ли вы привести пример со структурой таблицы и ее значением. и каким будет ваш результат в соответствии с этим
2. Добавил @CharveeShah, я надеюсь, что это имеет больше смысла, для меня это настоящий глоток
3. Правильно ли ‘e, a, g’ или это должно быть ‘e, f, g’? Если это правильно, то каков ваш ПЕРВИЧНЫЙ КЛЮЧ?
4. @Strawberry Извините, скользкие пальцы. это должно быть efg
Ответ №1:
попробуйте это.
select sum(themecount) from (select template.templateid,
count(distinct case when object.theme IS NOT NULL then object.theme end) themeCount
from Object object where
count(distinct object.isActive)>1
group by object.template_id)
Комментарии:
1. Я просто писал, почему это не сработает, но я думаю, что я слишком много думаю об этом. При дальнейшем размышлении и тестировании это совершенно идеально. Большое вам спасибо, Чарви
2. Я также благодарю вас за понимание того, что я спрашивал, я обнаружил, что это очень сложный вопрос, который нужно задать решительно.