MYSQL ПРИСОЕДИНЯЙТЕСЬ к той же таблице - PullRequest
0 голосов
/ 27 июля 2011

У меня сейчас есть такой запрос:

SELECT 
  topic.content_id, 
  topic.title, 
  image.location 
FROM 
  mps_contents AS topic 
  INNER JOIN mps_contents AS image 
    ON topic.content_id = image.page_id 
WHERE 
  topic.page_id = (SELECT page_id FROM mps_pages WHERE page_short_name = 'foo' ) 
  AND image.display_order = '1'

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

-----------------------------------------------------------
| page_id | content_id | title | location | display_order |
-----------------------------------------------------------
|    1    |     200    |  Foo  |   NULL   |     200       |
|    1    |     201    |  Baz  |   NULL   |     201       |
|   200   |     201    |  Bar  | jpg.jpg  |      1        |
-----------------------------------------------------------

And basically I want this result

---------------------------------
| content_id | title | location |
---------------------------------
|     200    |  Foo  | jpg.jpg  |
|     201    |  Baz  |   NULL   |
---------------------------------

В основном я хочу выбрать все темы, а также вернуть соответствующее изображение, если оно есть.Мой текущий запрос возвращает только все темы со связанными изображениями.Я попробовал ЛЕВОЕ И ПРАВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ, но, похоже, это не помогло.

1 Ответ

1 голос
/ 27 июля 2011

Когда вы фильтруете в OUTER JOIN, вы должны фильтровать в предложении ON или в качестве производной таблицы. Когда image.display_order = '1' находится в WHERE, это всегда будет ВНУТРЕННЕЕ СОЕДИНЕНИЕ

SELECT 
  topic.content_id, 
  topic.title, 
  image.location 
FROM 
  mps_contents AS topic 
  LEFT JOIN
  mps_contents AS image ON topic.content_id = image.page_id
             AND image.display_order = '1'  
WHERE 
  topic.page_id = (SELECT page_id FROM mps_pages WHERE page_short_name = 'foo' ) 

или

SELECT 
  topic.content_id, 
  topic.title, 
  image.location 
FROM 
  mps_contents AS topic 
  LEFT JOIN
  (
   SELECT *
   FROM mps_contents
   WHERE display_order = '1'
  ) AS image ON topic.content_id = image.page_id
WHERE 
  topic.page_id = (SELECT page_id FROM mps_pages WHERE page_short_name = 'foo' ) 
...