Соединение MySQL, которое показывает членов таблицы a, которые пусты в таблице b, но не наоборот - PullRequest
0 голосов
/ 27 мая 2011

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

У меня есть две таблицы. Веб-сайты - это список веб-сайтов (id | website), cdd - это список пользователей и сайта, на который они ссылались (userid | website | и т.д ..). Не каждый сайт, на который ссылаются пользователи, является спонсором, и поэтому в таблице сайтов. Также не каждый сайт-спонсор прислал нам пользователей. Мне нужен список количества пользователей от каждого спонсора, включая 0.

Это мой запрос:

SELECT w.website, COUNT(*) AS num FROM websites w LEFT JOIN cdd c ON w.website = c.website WHERE c.submitted LIKE '05/26/11 %' GROUP BY w.website ORDER BY num DESC;

В таблице веб-сайтов пять сайтов, но ни один из них не отправлял пользователей. Этот не появляется в запросах.

Есть мысли?

Ответы [ 3 ]

1 голос
/ 27 мая 2011

LEFT JOIN является правильным, но поскольку вы задаете предложение WHERE для таблицы (cdd) в правой части объединения, вы отфильтровываете веб-сайты, у которых нет связанной записи cdd.Вам необходимо указать этот критерий следующим образом:

[...]
FROM websites w 
LEFT JOIN cdd c ON w.website = c.website 
WHERE c.submitted IS NULL OR c.submitted LIKE '05/26/11 %' 
[...]

, который включает сайты, которые не присоединяются к какой-либо записи cdd, или

[...]
FROM websites w 
LEFT JOIN cdd c ON w.website = c.website AND c.submitted LIKE '05/26/11 %' 'Replaces WHERE clause 
[...]

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

Примечание. Чтобы гарантировать, что сайты без ассоциированных пользователей возвращают счетчик 0, вам также может понадобиться COUNT() столбец из cdd, а не * ...

1 голос
/ 27 мая 2011

Мне нужен список количества пользователей от каждого спонсора, включая 0.

В этом случае вам, вероятно, следует использовать левое соединение:

SELECT a.site, COUNT(b.ref_site) AS num FROM table1 a LEFT JOIN table2 b ON a.site = b.ref_site GROUP BY a.site;
0 голосов
/ 27 мая 2011

Вместо этого сделайте ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВЛЕВОМ, и я думаю, что вы готовы идти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...