Как присоединиться слева только к одному столу? - PullRequest
1 голос
/ 28 июля 2011

У меня есть два типа таблиц: одна для хранения текста и т. Д., Другая для хранения информации об изображении,

pages table,

pg_id     pg_content    parent_id 
10        xxx           3         
11        xxx           3  
12        xxx           3

image table,

img_id    pg_id   img_order     cat_id
1         10      1             1
2         10      1             2
3         10      2             2
4         11      1             1

Поэтому я хочу перечислить все страницы с изображением img_order 1 только из cat_id 1, но я получаю дублированные строки, когда на странице есть изображения в cat_id 2,

SELECT*
FROM root_pages

LEFT JOIN root_images_pages
ON root_images_pages.pg_id = root_pages.pg_id

WHERE root_pages.parent_id = '3'
AND root_pages.pg_id != '3'
AND (root_images_pages.img_order = '1' OR  root_images_pages.img_id is NULL)

ORDER BY root_pages.pg_created DESC
LIMIT 12

Как это исправить?

Я хочу получить результат,

pg_id     pg_content    parent_id     img_id    pg_id   img_order     cat_id    
    10        xxx           3          1         10      1             1         
    11        xxx           3          4         11      1             1  
    12        xxx           3          null      null    null          null

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

Мне нужнодобавьте эту строку ниже к запросу, в противном случае страница без изображений не может быть отображена,

AND (i.img_order = '1' OR i.img_id is NULL)

Так вот,

SELECT*
FROM root_pages p

LEFT JOIN root_images_pages i
ON i.pg_id = p.pg_id and i.cat_id = 1

WHERE p.parent_id = '3'
AND p.pg_id != '3'
AND p.pg_hide != '1'
AND (i.img_order = '1' OR i.img_id is NULL)

ORDER BY p.pg_created DESC
LIMIT 12

Ответы [ 4 ]

2 голосов
/ 28 июля 2011

Исключить cat_id = 2 в предложении where?

WHERE .... AND (root_images_pages.cat_id <> 2)

или явно разрешить только cat_id = 1?

WHERE .... AND (root_images_pages.cat_id = 1)
1 голос
/ 28 июля 2011

Как насчет этого, я думаю, что, добавив критерии cat_id к вашему объединению, вы можете получить данные, которые вы ищете:

SELECT*
FROM root_pages r

LEFT JOIN root_images_pages i
ON i.pg_id = r.pg_id and i.cat_id = 1

WHERE r.parent_id = '3'

ORDER BY r.pg_created DESC
LIMIT 12

после просмотра вашего редактирования, я думаю, что вам нужно переключить JOINсостояние.

LEFT JOIN root_images_pages i
ON r.pg_id = i.pg_id and i.cat_id = 1
1 голос
/ 28 июля 2011

Попробуйте использовать подзапрос, чтобы выбрать ваши страницы, а затем присоединиться к корневым изображениям слева

SELECT
    *
FROM
    (SELECT
        *
    FROM 
        root_images_pages
    WHERE
        cat_id = 1
    ) AS i
    LEFT JOIN root_pages AS p
    ON i.pg_id = p.pg_id
0 голосов
/ 28 июля 2011

Полагаю, у Марка правильный ответ.Но я также не думаю, что вам нужно:

OR  root_images_pages.img_id is NULL

Предполагая, что img_id является первичным ключом.

...