2012-03-27 65 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