MySQL присоединиться к лучшему варианту здесь? - PullRequest
1 голос
/ 16 мая 2011

кампании:

id     name            cap
1      Campaign1       2
2      Campaign2       1
3      Campaign3       1

служили:

id     id_campaign     ip
1      1               127.0.0.1
2      1               127.0.0.1
3      2               127.0.0.1

Результат запроса должен отображаться:

campaigns_id    campaigns_name          cap    count
1               Campaign1               2      2
2               Campaign2               1      1
3               Campaign3               1      0

Я использую этот запрос:

   SELECT served.id_campaign, 
          campaigns.name, 
          campaigns.cap, 
          COUNT( served.id ) AS count
     FROM campaigns
LEFT JOIN served ON campaigns.id = served.id_campaign
    WHERE served.ip =  '127.0.0.1' 
 GROUP BY served.id_campaign

Мой запрос отображает эти результаты (плохо, не показывается campaigns_id.3):

campaigns_id    campaigns_name          cap    count
1               Campaign1               2      2
2               Campaign2               1      1

Мне кажется, что я ошибаюсь, если хочу включить значения, которые не выбираются оператором "WHERE", поскольку в "serve" нет записей, соответствующих оператору WHERE для campaigns.id = '3'

Ответы [ 3 ]

2 голосов
/ 16 мая 2011

НОВОЕ РЕДАКТИРОВАНИЕ:

   SELECT campaigns.id as id_campaign, 
          campaigns.name, 
          campaigns.cap, 
          COUNT( served.id ) AS count
     FROM campaigns
LEFT JOIN served ON campaigns.id = served.id_campaign
      AND served.ip =  '127.0.0.1' 
 GROUP BY campaigns.id

СТАРЫЙ ПОЧТА:

Я пришел с этим запросом, который выдает желаемый результат:

(SELECT served.id_campaign, 
          campaigns.name, 
          campaigns.cap, 
          COUNT( served.id ) AS count
     FROM campaigns
LEFT JOIN served ON campaigns.id = served.id_campaign
    WHERE served.ip =  '127.0.0.1' 
 GROUP BY served.id_campaign)

UNION

(SELECT id, name, cap, 0 as count 
FROM campaigns 
WHERE id <> ALL 
     (
      SELECT campaigns.id 
      FROM campaigns, served 
      WHERE campaigns.id = served.id_campaign AND served.ip = "127.0.0.1"
     )
)
0 голосов
/ 16 мая 2011

Измените условие where на

WHERE served.ip =  '127.0.0.1' OR served.ip IS NULL
0 голосов
/ 16 мая 2011

LEFT JOIN говорит, что выводит все записи из левой таблицы и соответствующие записи из правой таблицы.Таким образом, serve.ip будет равен NULL с id = 3.Так что измените условие where, чтобы сделать его

WHERE serverd.ip = '127.0.0.1' or serverd.ip IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...