2015-08-03 4 views
0

У меня есть 2 таблицы MySQL;Проверьте две таблицы SQL

portal.campaignAccount_Relations:

+------------+----------+---------+ 
| relationID | campaign | account | 
+------------+----------+---------+ 
| 1   | 1  | 1  | 
| 2   | 2  | 1  | 
| 3   | 4  | 1  | 
| 4   | 3  | 2  | 
+------------+----------+---------+ 

и portal.campaign_queue:

+----+----------------------------+---------+ 
| id | title      | deleted | 
+----+----------------------------+---------+ 
| 1 | Lorem Ipsum Dolor Sit Amet | 0  | 
| 2 | Lorem Ipsum Dolor Sit Amet | 0  | 
| 3 | Lorem Ipsum Dolor Sit Amet | 1  | 
| 4 | Lorem Ipsum Dolor Sit Amet | 0  | 
+----+----------------------------+---------+ 

Я хочу, чтобы найти все строки portal.campaignAccount_Relations где `deleted` поле portal.campaign_queue является 0 для соответствующей кампании.

Я новичок в функции INNER JOIN MySQL, и у меня возникли проблемы с поиском поддержки этого типа запроса. Я пробовал:

SELECT campaignAccount_Relations.campaign, campaignAccount_Relations.account 
FROM campaignAccount_Relations 
INNER JOIN campaign_queue 
    ON campaign_queue.deleted = 0 AND campaign_queue.id=campaignAccount_Relations.campaign 

и получил значения, которые я искал. Это правильный/наиболее эффективный способ сделать это?

+2

Пожалуйста, дайте ему попробовать, это, как вы учитесь. Вы не узнаете, если мы просто напишем вам это. – Barmar

+1

Если вы не можете заставить его работать, отправьте свою попытку, и мы покажем вам, где вы поступили не так. – Barmar

+0

@Barmar спасибо. Я пробовал это: 'SELECT campaignAccount_Relations.campaign, campaignAccount_Relations.account FROM campaignAccount_Relations INNER JOIN campaign_queue ON campaign_queue.deleted = 0 AND campaign_queue.id = campaignAccount_Relations.campaign' и получил значения, которые я искал. Это правильный/наиболее эффективный способ сделать это? –

ответ

1

Ваш запрос будет работать, но условия, которые не относятся к обеим таблицам должны, как правило, в WHERE, не ON (исключение при выполнении внешних соединений - условия на вторичной таблице должны быть в предложении ON).

SELECT campaignAccount_Relations.campaign, campaignAccount_Relations.account 
FROM campaignAccount_Relations 
INNER JOIN campaign_queue ON campaign_queue.id=campaignAccount_Relations.campaign 
WHERE campaign_queue.deleted = 0 

DEMO

+0

Спасибо за ваше решение. Не могли бы вы помочь мне с еще одной проблемой? Я также хочу найти значения DISTINCT.Я попытался поставить DISTINCT после SELECT, но значения, полученные мной из таблицы, не изменились. Любые идеи относительно того, почему это происходит? –

+0

Я не вижу дубликатов в ваших данных образца. – Barmar

+0

Фактические данные разные, но я не могу разделить реальные данные в текущее время. –

-1

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

SELECT * FROM portal.campaignAccount_Relations car 
LEFT JOIN proal.campaign_que cq ON car.relationId = cq.id 
WHERE cq.deleted=0 

или, может быть, вы хотите следующее, не уверены, какой столбец реляционной колонки для кампаний ...

SELECT * FROM portal.campaignAccount_Relations car 
LEFT JOIN proal.campaign_que cq ON car.campaign = cq.id 
WHERE cq.deleted=0 

От mysql.com:

В MySQL JOIN, CROSS JOIN и INNER JOIN являются синтаксические эквиваленты (они могут заменить друг на друга)

я не испытывал ничего из этого, так что вы, возможно, придется корректировать синтаксис и т.д. ...

+2

'left join' - не правильное соединение здесь. Это работает только потому, что предложение 'where' превращает его в' inner join' автоматически –

+0

, что хорошо знать, оно будет работать, хотя верно, не говоря о его обязательно лучшей практике. – Karl

+0

Это неправильная практика. И мы не должны учить людей неправильной практике, не так ли? –