我有两张桌子。一个有一些产品细节,另一个有每个产品的各种照片。 对于我的问题,仅使用以下字段:
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
第二个查询将过滤那些有/没有照片但没有按产品名称排序的产品(因为原始列表按照照片名称排序)。
有没有办法在单个查询中完成我想要的(如果可能的话)?
答案 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