JOINS в MYSQL и пропущенные строки - PullRequest
0 голосов
/ 16 июля 2010

У меня есть запрос, подобный этому:

SELECT DISTINCT 
      `a`.*,
      `b`.*,
      `c`.*      
FROM `a`     
INNER JOIN `b` ON (`b`.`a_id` = `a`.`id` )     
INNER JOIN `c` ON (`c`.`id` = `b`.`c_id`)       
WHERE (
  (`a`.`id` = 12345) AND
  (`b`.`foo`= "bar")
)

По сути, это берет строку из a с id = 12345, и строки из b, которые относятся к этой строке, а также строки из cв этой строке b только из строк в b есть foo = bar

В данный момент, если нет строки b, в которой есть foo = bar, строка даже не возвращается.Это не верно.Я хочу, чтобы независимо от того, что возвращается соответствующая строка (есть ли bs и cs).Как я могу это сделать?(есть ли способ?)

Ответы [ 3 ]

6 голосов
/ 16 июля 2010

Я думаю, вы должны посмотреть, как делать НАРУЖНЫЕ СОЕДИНЕНИЯ. Похоже, это то, что вы просите.

Что-то вроде:

SELECT DISTINCT 
  `a`.*,
  `b`.*,
  `c`.*
FROM `a` 
LEFT OUTER JOIN 
  `b` ON `b`.`a_id` = `a`.`id`
LEFT OUTER JOIN  
  `c` ON `c`.`id` = `b`.`c_id`
WHERE 
  `a`.`id` = 12345

РЕДАКТИРОВАТЬ: с новой информацией (условие на b, которое должно иметь столбец foo = bar. Это работает, когда в b нет строки вообще. Но если есть один с foo = notbar, я хочу, чтобы это было верните также), попробуйте это. Примечание: я убрал галочки, чтобы было легче читать и видеть кавычки.

SELECT DISTINCT 
  a.*,
  b.*,
  c.*
FROM a 
LEFT OUTER JOIN 
  b ON b.a_id = a.id and b.foo = 'bar'
LEFT OUTER JOIN  
  c ON c.id = b.c_id
WHERE 
  a.id = 12345
1 голос
/ 16 июля 2010

Как сказал MJB, вам нужно использовать внешнее соединение, чтобы строки a включались, когда в b нет соответствующих строк.

Если вы хотите ограничить совпадающие строки в b теми, которые соответствуют другому условию, вам нужно поместить эти условия в выражение JOIN для b.Если вы оставите условия для b в предложении WHERE, это исключит соединенные строки, в которых столбцы b равны NULL из-за внешнего соединения.

SELECT DISTINCT 
      `a`.*,
      `b`.*,
      `c`.*      
FROM `a`     
LEFT OUTER JOIN (`b` INNER JOIN `c` ON (`c`.`id` = `b`.`c_id`))
  ON (`b`.`a_id` = `a`.`id` AND `b`.`foo` = 'bar')     
WHERE `a`.`id` = 12345

Обратите внимание, я использовал скобки для объединения c в b перед вычислением внешнего соединения с a.

Также я рекомендую использовать одинарные кавычки для строковых литералов, а не двойные кавычки.Просто чтобы привыкнуть использовать стандартный SQL, где это возможно, вместо специфического для MySQL синтаксиса.

0 голосов
/ 16 июля 2010

Как объяснил MJB, вы ищете ВНЕШНЕЕ СОЕДИНЕНИЕ.

Соединения Tuturial

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