2012-03-27 68 views
1

我有两张表。一个有一些产品细节,另一个持有每个产品的各种照片。 对于我的问题,只是使用了下列字段:mysql自定义订单

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

尝试此查询 -

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

谢谢这个工作立刻 – andrew 2012-03-27 07:41:52

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; 
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 

如果你只whant的产品照片,你可以使用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