Объединение 2 запросов MySQL с использованием подзапросов - PullRequest
2 голосов
/ 27 апреля 2011

Мне было интересно, может ли кто-нибудь здесь помочь с моей проблемой.Я пытаюсь объединить 2 MySQL запросов в один запрос, используя подзапросы.В настоящее время у меня есть 2 запроса отдельно, которые дают результаты, которые я хочу:

Вот 2 запроса:

SELECT contact_id FROM contacts 
WHERE acc_id = 1 AND email LIKE "paul%"

SELECT c0.contact_id 
FROM contact_tags c0 INNER JOIN contact_tags c1 
on c0.contact_id = c1.contact_id INNER JOIN contact_tags c2 
on c1.contact_id = c2.contact_id where c0.tag_id = 1 
AND c1.tag_id = 2 AND c2.tag_id = 3

Вот несколько примеров данных из таблиц:

Contacts:

contact_id    acc_id     email
    54          1        paul@test.com

Tags:

id     contact_id     tag_id 
1         54            1
2         54            2
3         54            3
4         50            1
5         50            2

Оба запроса при запуске независимо выдают правильный результат:

contact_id
    54

Однако я пытаюсь вложить один запрос в другой, чтобы получить один и тот же результат из одного запроса:

Вот что я пробовал:

SELECT c0.contact_id 
FROM 
(
  SELECT contact_id 
   FROM contacts 
    WHERE acc_id = 1 AND email LIKE "paul%"
) AS c0 
LEFT JOIN contact_tags AS c1 
ON c1.contact_id = c0.contact_id 
AND (
  SELECT c0.contact_id FROM contact_tags c0 
  INNER JOIN contact_tags c1 
  on c0.contact_id = c1.contact_id 
  INNER JOIN contact_tags c2 on c1.contact_id = c2.contact_id 
  where c0.tag_id = 1 AND c1.tag_id = 2 AND c2.tag_id = 3
   ) 
 WHERE c1.id IS NOT NULL

Однако я знаю, что это неправильно, поскольку я хочу вернуть только один уникальный идентификатор контакта, который соответствует всем условиям, как указано выше:

contact_id
   54
   54
   54
   54

Если бы кто-нибудь мог помочь мне с этим, это было бы очень ценно.

Спасибо

Ответы [ 2 ]

2 голосов
/ 27 апреля 2011
Select contact_id
From contacts
Where acc_id = 1 And email Like 'paul%'
    And contact_id In   (
                            Select Tags1.contact_id
                            From contact_tags As Tags1
                            Where Tags1.tag_id In(1,2,3)
                            Group By Tags1.contact_id
                            Having Count( Distinct Tags1.tag_id ) = 3
                            )

Или:

Select contact_id
From contacts
Where contact_id In (
                        Select C1.contact_id
                        From contact_tags As Tags1
                            Join contacts As C1
                                On C1.contact_id = Tags1.contact_id
                        Where Tags1.tag_id In(1,2,3)
                            And C1.acc_id = 1
                            And C1.email Like 'paul%'
                        Group By C1.contact_id
                        Having Count( Distinct Tags1.tag_id ) = 3
                        )
1 голос
/ 27 апреля 2011

Чтобы получить запрос, который возвращает все контакты, которые будут возвращены как из первого , так и второго запроса, используйте это:

(при условии, что первый не возвращает дубликат contact_id с)

SELECT contact_id
FROM contacts 
WHERE acc_id = 1
  AND email LIKE "paul%"

  AND contact_id IN

  ( SELECT c0.contact_id 
    FROM contact_tags c0
      INNER JOIN contact_tags c1 
        ON c0.contact_id = c1.contact_id
      INNER JOIN contact_tags c2 
        ON c1.contact_id = c2.contact_id
    WHERE c0.tag_id = 1 
      AND c1.tag_id = 2
      AND c2.tag_id = 3
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...