SQL-запрос соединяет ограничение результатов до одного элемента на идентификатор - PullRequest
0 голосов
/ 21 декабря 2011

Итак, у меня есть 2 таблицы ... Продукты и изображения

Products 
---------
id
value1
value2
value3
etc..

Images
---------
id
productId
imageName

Таблица изображений будет иметь более одного изображения для каждого продукта, поэтому при выполнении этого запроса: (! = 0 потому, что некоторые изображения не имеют productId, поэтому я хочу исключить их, не уверенный, есть ли лучший способ справиться с этим, или мне даже нужно включить это)

select p.*, i.imageName 
from products p, images i 
where p.id = i.productId and i.productId != 0 

Я получаю результаты, но он дает мне несколько записей, и я просто хочу получить по одному результату на каждый продукт, и я хочу, чтобы он поднял ОБРАЗ, КОТОРЫЙ ДОБАВЛЕН ПЕРВЫМ (поэтому самый старый) ...

В настоящее время результаты выглядят следующим образом ---

id : 1
imagename: name1.jpg

id : 2
imagename: name5.jpg

id: 2
imagename: name6.jpg

id: 2
imagename: name7.jpg

id: 3
imagename:  name3.jpg

etc... etc... 

Я хочу, чтобы это выглядело так ...

id: 1
imagename: name1.jpg

id: 2
imagename: name5.jpg

id: 3
imagename: name 3.jpg

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

Ответы [ 4 ]

3 голосов
/ 21 декабря 2011

Добавление «group by p.id» в конце вашего запроса должно сработать, но теперь вы не знаете, какое изображение вы получаете.

прощай

Джанлука

3 голосов
/ 21 декабря 2011

Нечто подобное будет работать, хотя вам придется проверить это на опечатки.

SELECT p.*,
       (SELECT i.imageName
          FROM images
         WHERE i.productId = p.id
        ORDER BY i.date_created ASC
         LIMIT 1)
          AS imageName
  FROM products p
1 голос
/ 21 декабря 2011

Вам нужен столбец в таблице изображений, в котором хранятся дата и время добавления каждого изображения.Тогда вы сможете сделать это (надеюсь, не знаю, если MySQL это разрешит):

select p.*, i.imageName 
  from products p, images i 
 where p.id = i.productId 
   and i.productId != 0 
   and i.addedDate = (select min(i2.addedDate)
                        from images i2
                       where i2.productId = p.id)
0 голосов
/ 21 декабря 2011

Я использовал images.id в качестве метода определения самого старого.Вы можете использовать поле даты или даты и времени, но если для этого продукта было добавлено более одного изображения одновременно, вы получите несколько записей, если запрос не будет дополнительно изменен, чтобы учесть эту возможность.Я предполагаю, что image.id уникален, и поэтому у меня не будет этой проблемы

select p.id
     , im.imageName
  from products p
left
  join ( select id
              , theDate
              , imageName
           from images
           join (select min(id) minId
                         from images
                      group 
                          by productId) oldestImages
             on oldestImages.minId = images.id
  ) im
  on im.productId = p.id
...