mysql: оставлено соединение, но выберите один конкретный элемент из объединенной таблицы - PullRequest
4 голосов
/ 29 ноября 2010

Мне нужно выбрать строку только из двух соответствующих таблиц, например,

членский стол,

member_id   member_name
1           xxx
2           yyy

таблица профилей_картин

image_id   member_id   image_approved
1          1           no
2          1           no
3          1           yes

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

SELECT *
    FROM member 

    LEFT JOIN profile_picture 
    ON profile_picture.member_id = member.member_id

    WHERE member.member_id = '1'

Я хотел бы получить это как вывод,

member_id   member_name image_id image_approved
1           xxx         3        yes

возможно ли это?

спасибо.

редактирование:

спасибо, ребята, за предложения. многие из вас предложили использовать AND - например, AND profile_picture.image_approved = 'yes'

работает только при наличии изображения. но если изображение отсутствует, то ничего не выводится, даже если оно выводится, как показано ниже, если изображение отсутствует.

member_id   member_name image_id image_approved
1           xxx         null      null

еще раз спасибо!

Ответы [ 5 ]

2 голосов
/ 29 ноября 2010
select
  *
from
  member m
  left join profile_picture p on p.member_id = m.member_id
where
  m.member_id = '1'
  and (p.image_approved is null or p.image_approved = 'yes')

image_approved не является частью условия соединения, поэтому я не включаю это в предложение join. Это скорее часть условия выбора строки, поэтому оно входит в where. Думая о том, что вы хотите, вы либо ничего не хотите в profile_picture, либо в утвержденной строке. Итак, условия.

0 голосов
/ 29 ноября 2010

Либо добавьте NULL в предложение WHERE, как рекомендовал Донни, либо используйте табличное выражение для ограничения вашей второй таблицы следующим образом:

Select member.member_id, member_name, image_id, image_approved
From member LEFT Outer Join
     ( Select image_id, member_id, image_approved
       From profile_picture
       Where image_approved = 'yes' ) Images
          on Images.member_id = member.member_id
0 голосов
/ 29 ноября 2010

Вы имеете в виду:

SELECT * 
    FROM member  
    LEFT JOIN profile_picture  
    ON profile_picture.member_id = member.member_id 
    WHERE member.member_id = '1' 
    AND profile_picture.image_approved = 'yes'
0 голосов
/ 29 ноября 2010

Вам не нужно использовать LEFT JOIN там, где подходит INNER JOIN.Вам нужен столбец на profile_picture, верно?Кажется, все, что вам нужно, это дополнительное WHERE условие:

SELECT
   *
FROM
   member
   JOIN profile_picture USING (member_id)
WHERE
   member_id = 1
   AND image_approved = 'yes'

Есть ли возможность иметь более одного столбца в правой таблице, и вы хотите получить только один?Хотите последнее одобренное изображение?Добавьте эти:

GROUP BY
   member_id
ORDER BY
   image_id
0 голосов
/ 29 ноября 2010

Добавление условия image_approved к вашему запросу дает результат, необходимый для заданных входных данных.

SELECT *
    FROM member 

    LEFT OUTER JOIN profile_picture 
    ON profile_picture.member_id = member.member_id

    WHERE member.member_id = '1'
          AND image_approved = 'yes'
...