SQL Select записи со связанными изображениями - PullRequest
2 голосов
/ 09 января 2012

Я не так много работаю с SQL, поэтому я немного растерялся.

У меня есть три таблицы:

images (id, image_path)

shop_entries (id, title, ....)

shop_img (shop_id, img_id)

Я хочу отобразить все записи магазина и связанные с ними изображения.В настоящее время мой SQL возвращает разность shop_entries (каждый раз, когда с ним связано 1 изображение).Я хочу вернуть shop_entries только один раз, но с несколькими изображениями, связанными с ним.

Мой SQL выглядит следующим образом:

SELECT s.*, images.*  
FROM shop_entries s 
LEFT JOIN shop_img ON shop_img.shop_id = s.id 
LEFT JOIN images ON images.id = shop_img.img_id 

Обновление * Ответ ниже работал, но теперь я хотел добавитьдругая таблица к запросу, тот же принцип: помимо изображений у меня есть таблица «размеры» и «shop_sizes».

Этот запрос привел к двойным изображениям и двойным размерам, что здесь не так:

Select SE.*

 , Group_Concat(I.path Order By I.path ASC Separator ', ') as images
 , Group_Concat(S.title Order By S.title ASC Separator ', ') as sizes
 From shop_entries As SE

            Left Join shop_img As SI
                On SI.shop_id = SE.id
            Left Join images As I
                On I.id = SI.img_id

            Left Join shop_sizes As SS
                On SS.shop_id = SE.id
            Left Join sizes As S
                On S.id = SS.size_id

        Group By SE.id, SE.title

Ответы [ 2 ]

3 голосов
/ 09 января 2012
Select SE.ie, SE.title
    , Group_Concat(I.image_path Order By I.image_path ASC Separator ', ')
From shop_entries As SE
    Left Join shop_img As SI
        On SI.shop_id = SE.id
    Left Join images As I
        On I.id = SI.img_id
Group By SE.ie, SE.title
1 голос
/ 09 января 2012

Сгруппируйте изображения и размеры отдельно, затем объедините результирующие наборы в shop_entries, чтобы получить окончательный результат:

SELECT
  SE.*,
  COALESCE(GI.images, '') AS images,
  COALESCE(GS.sizes,  '') AS sizes
FROM shop_entries AS SE

  LEFT JOIN (
    SELECT
      SI.shop_id,
      GROUP_CONCAT(I.path ORDER BY I.path ASC SEPARATOR ', ') AS images
    FROM shop_img AS SI
      INNER JOIN images AS I ON SI.img_id = I.id
    GROUP BY SI.shop_id
  ) AS GI ON SE.id = GI.shop_id

  LEFT JOIN (
    SELECT
      SS.shop_id,
      GROUP_CONCAT(S.title ORDER BY S.title ASC SEPARATOR ', ') AS sizes
    FROM shop_sizes AS SS
      INNER JOIN sizes AS S ON SS.size_id = S.id
    GROUP BY SS.shop_id
  ) AS GS ON SE.id = GS.shop_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...