MySQL запрос поиска в левом соединении, которые имеют условие, связанное со столбцом

0

У меня есть две таблицы (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  | 
+----+-------+---------+------+
Теги:
search
left-join

1 ответ

1

Немного хакерский способ добиться того, чего вы пытаетесь достичь.

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 для выбора самого низкого набора.

В внешнем запросе используется этот тип, заданный из предыдущего внутреннего запроса, для включения только строк, которые имеют только эти типы

  • 0
    Благодарю. Кажется, что это решение.
  • 0
    @esmaeilsoomari Нет, это не законченное решение. Я разместил комментарий к сообщению для условия связи

Ещё вопросы

Сообщество Overcoder
Наверх
Меню