MySQL Выбрать ВСЕ из левого соединения - PullRequest
0 голосов
/ 12 февраля 2012

Этот запрос не работает.Я хочу получить все результаты из LEFT JOIN, где что-то есть.Это мой точный код:

SELECT * FROM `swarovski_zones` WHERE `siteid`='200'
LEFT JOIN `trafficviews` ON `swarovski`.`id`=`trafficviews`.`adid`

swarovski_zones таблица siteid 200

trafficviews таблица adid 200

200 - это связующая переменная между таблицами.Я хочу все из обеих таблиц, где идентификатор 200.

Ответы [ 3 ]

7 голосов
/ 12 февраля 2012

Запрос не работает, потому что синтаксис неверен.Должно быть:

select
from
join
on
where
group by
having
order by
limit

Даю вам:

select *
  from `swarovski_zones`
  left join `trafficviews`
    on `swarovski`.`id` = `trafficviews`.`adid`
 where `siteid` = '200'

Также siteid означает строку, а не целое число?

Я, наверное,буду сожалеть, предоставив список выше ...

Limit!Я забыл Limit;полный список синтаксиса здесь

1 голос
/ 12 февраля 2012

Проблема здесь в том, что элементы в вашей правой таблице (обзор трафика) могут не иметь соответствующей строки в левой таблице (swarovski_zones). Таким образом, левое соединение получит все элементы слева и может пропустить некоторые элементы справа.

Чтобы решить эту проблему, вам нужно внешнее соединение. Ваша проблема в том, что MySQL не поддерживает внешние объединения :) Это решается следующим общим способом:

SELECT * FROM a LEFT JOIN b ON a.id = b.id
UNION ALL
SELECT * FROM a RIGHT JOIN b ON a.id = b.id WHERE a.id IS NULL;

Применительно к вашему вопросу это должно быть что-то вроде:

SELECT * FROM swarovski_zones s
LEFT JOIN trafficviews ON s.id = t.adid
UNION ALL
SELECT * FROM swarovski_zones s
RIGHT JOIN trafficviews ON s.id = t.adid WHERE s.id IS NULL
WHERE s.siteid = 200 or t.adid = 200

Попробуйте.

1 голос
/ 12 февраля 2012

Пользователь полное внешнее объединение

SELECT * FROM `swarovski_zones` WHERE `siteid`='200'
FULL OUTER JOIN `trafficviews` ON `swarovski`.`id`=`trafficviews`.`adid`
...