У меня есть две таблицы (A & B):
таблица A:
+----+--------+ | id | title | +----+--------+ | 1 | white | | 2 | blue | | 3 | red | | 4 | white | | 5 | blue | +----+--------+
таблица B:
+----+---------+------+------+ | id | content | A_id | type | +----+---------+------+------+ | 1 | dog | 1 | good | | 2 | dog | 1 | bad | | 3 | cat | 2 | good | | 4 | cat | 2 | bad | | 4 | cat | 2 | ugly | | 6 | crow | 3 | good | | 7 | crow | 3 | bad | | 8 | crow | 3 | ugly | | 9 | mouse | 2 | good | | 10 | zebra | 3 | bad | | | | | | +----+---------+------+------+
результат по этому запросу:
SELECT A.*, B.content, B.type FROM A
LEFT JOIN B ON A.id=B.A_id
WHERE B.content='dog' OR B.content='cat' OR B.content='crow'
ORDER BY A.id ASC;
было бы:
+----+-------+---------+------+ | id | title | content | type | +----+-------+---------+------+ | 1 | white | dog | good | | 1 | white | dog | bad | | 2 | blue | cat | good | | 2 | blue | cat | bad | | 2 | blue | cat | ugly | | 3 | red | crow | good | | 3 | red | crow | bad | | 3 | red | crow | ugly | +----+-------+---------+------+
Это обновление для:
id = 1 имеет два типа:
good
и bad
но для
id = 2 и id = 3 имеет три типа:
good
, bad
и ugly
.
вместо вышеизложенного я хочу получить запрос, который дает только те идентификаторы, которые имеют общие типы в id=1 and id=2 and id=3
. это означает, что если для id=1
типы результатов являются good
и bad
для id=2 and 3
то строками, которые имеют тип = ugly
следует пренебречь. Я хочу запрос, который даст мне этот результат:
+----+-------+---------+------+ | id | title | content | type | +----+-------+---------+------+ | 1 | white | dog | good | | 1 | white | dog | bad | | 2 | blue | cat | good | | 2 | blue | cat | bad | | 3 | red | crow | good | | 3 | red | crow | bad | +----+-------+---------+------+
Немного хакерский способ добиться того, чего вы пытаетесь достичь.
select A.*,B.*
from B
cross join(
select
group_concat(type) all_types,
count(distinct type) type_count
from B
where B.content IN('dog','cat','crow')
group by content, A_id
order by type_count
limit 1
) B1
join A on A.id = B.A_id
where B.content IN('dog','cat','crow')
and find_in_set(b.type,B1.all_types) >0
Первый внутренний запрос получит наименьшие отдельные типы в виде списка с group_concat
, используя group_concat
который соответствует таблице B
, используя предел 1 для выбора самого низкого набора.
В внешнем запросе используется этот тип, заданный из предыдущего внутреннего запроса, для включения только строк, которые имеют только эти типы