MySQL заказ по - PullRequest
       8

MySQL заказ по

1 голос
/ 27 марта 2012

У меня есть две таблицы. У одного есть некоторые детали продукта, у другого есть различные фотографии для продукта. Для моей задачи используются только следующие поля:

tableA
id - prodName

tableB
id - prod_id - photoName

где tableA.id = tableB.prod_id

Не во всех продуктах есть фотографии (другими словами, не каждый tableA.id существует в tableB). Меня интересует только первое фото каждого товара (на котором есть фотографии).

Какой запрос позволил бы мне перечислить все товары на моей странице, показывая сначала те, у которых есть фотографии, а в конце те, у которых нет фотографий? Оба набора должны быть в алфавитном порядке в зависимости от названия продукта.

Пока я проверил следующее без 100% успеха

Using two queries:
Query 1st: SELECT prod_id FROM tableB WHERE photoName <> '' GROUP BY prod_id ORDER BY photo_name
this will give me (with some php scripting) a list (comma seperated) of all products with photos, sorted by photo name

Query 2: SELECT ..... FROM tableA WHERE ..... ORDER BY FIND_IN_SET(id, '$myList') DESC,   prodName ASC 

Второй запрос отфильтрует товары, которые имеют / не имеют фотографий, но не отсортированы по названию продукта (поскольку исходный список упорядочен по имени фотографии).

Есть ли способ выполнить то, что я хочу, в одном запросе (если это возможно)?

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

Попробуйте этот запрос -

SELECT a.prodName FROM tableA a
  LEFT JOIN tableB b
    ON a.id = b.prod_id
GROUP BY
  a.id
ORDER BY
  IF(b.prod_id IS NULL, 1, 0), a.prodName;
0 голосов
/ 27 марта 2012

попробуйте присоединиться влево, поскольку не во всех продуктах есть фотографии:

SELECT * FROM tableA tA
LEFT JOIN tableB tB ON ta.id = tB.prod_id
WHERE tB.id = (SELECT MIN(id) FROM tableB tB1 WHERE tB1.prod_id = tB.prod_id)
ORDER BY prodName, photoName

, если вам нужны только продукты с фотографиями, вы можете использовать INNER JOIN вместо:

SELECT * FROM tableA tA
INNER JOIN tableB tB ON ta.id = tB.prod_id
WHERE tB.id = (SELECT MIN(id) FROM tableB tB1 WHERE tB1.prod_id = tB.prod_id)
ORDER BY prodName, photoName
0 голосов
/ 27 марта 2012

Вы можете объединить результаты.

select tableA.prod_id, tableA.prodName, tableB.photoName from tableA 
inner join tableB on tableA.id = tableB.prod_id 
group by tableA.id order by tableA.prodName asc 
union 
select tableA.prod_id, tableA.prodName, tableB.photoName 
from tableA left join tableB on tableA.id = tableB.prod_id 
where tableB.photoName is null order by tableA.prodName asc;
...