mysql自定义顺序

时间:2012-03-27 06:57:47

标签: mysql sql-order-by

我有两张桌子。一个有一些产品细节,另一个有每个产品的各种照片。 对于我的问题,仅使用以下字段:

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 个答案:

答案 0 :(得分:3)

尝试此查询 -

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;

答案 1 :(得分:0)

您可以结合结果。

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;

答案 2 :(得分:0)

尝试离开加入,因为并非所有产品都有照片:

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