Может ли кто-нибудь решить эту проблему mysql WHERE COUNT?

Я объединяю две таблицы вместе, и я хочу перечислить только те строки, в которых количество сгруппированных строк не соответствует значению частей таблицы A.

table A
id     name    pieces
1      name_1    6
2      name_2    2

table B
a_id
1
1
2
2

Итак, я хочу получить все a.name, где a.piece <> количество сгруппированных строк. что-то вроде этого:

SELECT a.name
FROM   a
       INNER JOIN b
               ON a.id = b.a_id
WHERE  a.pieces <> Count(*)
GROUP  BY id  

это приводит к недопустимому использованию групповой функции
также пробовал это:

SELECT a.name,
       Count(*) AS count
FROM   a
       INNER JOIN b
               ON a.id = b.a_id
WHERE  a.pieces <> count
GROUP  BY id 

error: unknown column 'count'

В этом случае, как результат, я хочу получить только 1 строку, например:

name     count
name_1     2

Поскольку name_1 имеет 2 сгруппированных строки из table.b, и он не соответствует a.piece, равному 6.

Вместо! == я хотел написать <>, но stackoverflow не показывал эту комбинацию символов

Ninet9 22.11.2018 19:28
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
1
31
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать MAX() на pieces, поскольку это только скалярное значение, это не будет иметь значения. Это также сделает запрос совместимым с режимом only_full_group_by.

SELECT a.id, a.name, COUNT(*) AS count
FROM   a
       INNER JOIN b
               ON a.id = b.a_id
GROUP  BY a.id, a.name 
HAVING MAX(a.pieces) <> COUNT(*) 

Вы можете мне сказать, что такое only_full_group_by?

Ninet9 22.11.2018 19:35

@ Ninet9 проверьте этот ответ: stackoverflow.com/a/41887524/2469308

Madhur Bhaiya 22.11.2018 19:36

Спасибо. Меня устраивают эти строгие правила.

Ninet9 22.11.2018 19:39

@ Ninet9 да, вам следует использовать строгий режим, так как это правильный способ и соответствует стандарту ANSI

Madhur Bhaiya 22.11.2018 19:40

Вы можете агрегировать данные из tableb и объединить их с tablea:

SELECT tablea.name
FROM tablea
INNER JOIN (
    SELECT a_id, COUNT(*) AS c
    FROM tableb
    GROUP BY a_id
) AS groupedb ON tablea.id = tableb.a_id
WHERE tablea.pieces <> groupedb.c

Другие вопросы по теме