2010-07-24 2 views
1

, пожалуйста, кто-нибудь может мне помочь с этим. Кажется, я не могу понять, что мне нужно, чтобы получить то, что я хочу. Ниже мой стол.Выбор MySQL, который принимает 2 значения из столбца и возвращает одну строку

| product_id | product_name | product_thumb_image | 
------------------------------------------------------ 
|  1  | ProductA | images/img_A.jpg | 
|  2  | ProductB | images/img_B.jpg | 
|  3  | ProductB | images/img_B2.jpg | 
|  4  | ProductC | images/img_C.jpg | 
|  5  | ProductD | images/img_D.jpg | 

Уведомление о наличии 2 ProductBs.

Я бы хотел, чтобы оператор SQL выбирал «product_thumb_image» так, чтобы он возвращал строку для каждого имени продукта, но если у продукта есть второе изображение, тогда возвращается второй столбец.

например.

| mages/img_A.jpg | NULL/0/''   | 
| mages/img_B.jpg | images/img_B2.jpg | 
| mages/img_C.jpg | NULL/0/''   | 
| mages/img_D.jpg | NULL/0/''   | 

Любая помощь будет оценена, спасибо.

+0

Может ли продукт иметь более двух изображений? – Mike

+0

Да, это может быть, хотя обычно это не будет превышать 5 – Martin

ответ

1

Это значительно проще решить с помощью функций ранжирования, но MySQL их еще не поддерживает. Вместо этого, вы можете имитировать ранг:

Select P.product_name 
    , Min(Case When P.ProductRank = 0 Then product_thumb_image End) As Image0 
    , Min(Case When P.ProductRank = 1 Then product_thumb_image End) As Image1 
From (
     Select product_id, product_name, product_thumb_image 
      , (Select Count(*) 
       From Products As P2 
       Where P2.product_name = P1.product_name 
        And P2.product_id < P1.product_Id) As ProductRank 
     From Products As P1 
     ) As P 
Group By P.product_name 

Вот еще один способ, чтобы написать один и тот же запрос, который может работать лучше:

Select P.product_name 
    , Min(Case When P.ProductRank = 0 Then product_thumb_image End) As Image0 
    , Min(Case When P.ProductRank = 1 Then product_thumb_image End) As Image1 
From (
     Select P1.product_id, P1.product_name, P1.product_thumb_image 
      , Count(P2.product_id) As ProductRank 
     From Products As P1 
      Left Join Products As P2 
       On P2.product_name = P1.product_name 
        And P2.product_id < P1.product_Id 
     Group By P1.product_id, P1.product_name, P1.product_thumb_image 
     ) As P 
Group By P.product_name 
+0

Спасибо Томас, но когда я запускаю SQL-запрос в phpMyAdmin, ничего не происходит, я даже не получаю сообщение об ошибке или не сообщается, что было возвращено 0 строк. – Martin

+0

@Martin - Нечетный. Используя ваши тестовые данные, я действительно получил желаемые результаты. Получаете ли вы результаты, когда запускаете только внутренний запрос? В первом запросе вы просто выбираете непосредственно из таблицы продуктов, поэтому не должно быть никаких причин, по которым вы не получите результатов. Во втором решении он снова остался против себя, вы должны что-то получить. – Thomas

+0

Спасибо Томас, оба ваши SQL-заявления работают хорошо, хотя и немного длинны. Они отвечают на вопрос, который я задал, +1 для вас. Спасибо! – Martin

1

Вам понадобятся два подзаголовка. Один для получения первого изображения, один для второго:

SELECT t1.product_name, t2.product_thumb_image, t3.product_thumb_image 
FROM mytable t1 
LEFT OUTER JOIN (SELECT x.product_thumb_image 
       FROM mytable x 
       WHERE x.product_name = t1.product_name 
       LIMIT 0,1) t2 
LEFT OUTER JOIN (SELECT x.product_thumb_image 
       FROM mytable x 
       WHERE x.product_name = t1.product_name 
       LIMIT 1,1) t3 
GROUP BY t1.product_name 
1

С переменным числом изображений для каждого продукта, писать MySQL возвращать столбцы вы хотите, будет сложным и довольно неуклюжим. Вместо этого, почему бы не запустить простой GROUP_CONCAT, чтобы вернуть список с разделителями-запятыми, а затем разделить результаты в вашем приложении. Когда вы возвращаете список имен файлов, разделитель запятой вряд ли встречается в имени файла:

SELECT 
    `product_name`, 
    GROUP_CONCAT(`product_thumb_image`) AS product_thumb_images 
FROM `product` 
GROUP BY `product_name`; 

+--------------+------------------------------------+ 
| product_name | product_thumb_images    | 
+--------------+------------------------------------+ 
| ProductA  | images/img_A.jpg     | 
| ProductB  | images/img_B.jpg,images/img_B2.jpg | 
| ProductC  | images/img_C.jpg     | 
| ProductD  | images/img_C.jpg     | 
+--------------+------------------------------------+ 
+0

Майк фантастическое решение! Спасибо! Простой SQL-оператор, который удовлетворяет мои потребности по-другому. – Martin

Смежные вопросы