2013-07-10 52 views
1

我有以下SQL:讓所有不同的值,但不會重複從多個記錄

SELECT o.order_id, ol.product_manufacturer 
FROM orders o 
INNER JOIN order_lines ol 
ON o.order_id = ol.order_id 
WHERE o.deadline_time > UNIX_TIMESTAMP() 

我也有這些表:

orders: 
order_id, somefield, somefield, somefield... 

order_lines: 
id, order_id, product_manufacturer, somefield, somefield... 

我想所有的訂單,其中期限尚未傳遞並按照product_manufacturer對它們進行分組,但如果訂單有三條訂單行,全部都有product_manufacturer標識,那麼它只應返回標識標識。如果它有兩個具有不同product_manufacturer id的訂單行,則它應該返回id兩次,以此類推。

我使用PHP,我想用這樣一個數組,結束了:

$group[manufacturer_id] = array(order_id, order_id, order_id); 

編輯:其實我想它返回MANUFACTURER_ID = 999,如果有在多個廠商的IDS訂購。對不起,這個錯誤。

編輯2:我列出所有訂單,但我必須按製造商列出它們。像這樣:

SONY 
Order 1 
Order 2 
Order 16 
Order 99 

PROSONIC 
Order 3 
Order 88 
Order 98 

後來,它應該是可以搜索的,所以我將不得不做出類似WHERE ol.product_name LIKE「%$查詢」,但我會補充說,後來,當它的工作原理。

+0

選擇不同... – Strawberry

+0

@Strawberry - SELECT DISTINCT不會得到我的order_id,如果在ORDER_LINES不同 –

+0

@UlrikMcArdle - 你所要求的'這聽起來像所有orders'你想要簡單的數據。但是接下來你將它們按照product_manufacturer進行分組,然後再次返回'return the id ones'。你可以嘗試改變或畫一張桌子,你想看看輸出嗎? –

回答

1
SELECT o.order_id,group_concat(distinct(ol.product_manufacturer)) as manufacturer 
FROM orders o 
INNER JOIN order_lines ol 
ON o.order_id = ol.order_id 
WHERE o.deadline_time > UNIX_TIMESTAMP() 
group by o.order_id 

這將返回

Order_id manufacturer 
1   sony, panasonic 
2   sony 

SELECT o.order_id, 
CASE WHEN count(distinct(ol.product_manufacturer)) >1 
        THEN '999' ELSE product_manufacturer END as manufacturerid 
FROM orders o 
INNER JOIN order_lines ol 
ON o.order_id = ol.order_id 
WHERE o.deadline_time > UNIX_TIMESTAMP() 
group by o.order_id 

這將返回

Order_id manufacturerid 
    1   999 
    2   sony 
+0

哦,是的...這幾乎是好的。 Hov kan我讓它返回999而不是1,2 ... –

+0

你的意思是你不想要order_id? – sel

+0

我這樣做,但製造商應該只是一個號碼,如果有多個返回999其他返回製造商ID。此外,它應該由製造商排序,而不是訂單ID。但那只是順序應該改變,我可以管理:) –

1

據我所見,你不能從單個SQL命令獲得這種形式的輸出。 我建議你得到SELECT DISTINCT product_manufacturer FROM order_lines,然後從所有訂單中搜索每個product_manufacturer沒有通過截止日期。 對於前:

SELECT o.order_id FROM orders o, order_lines ol 
WHERE o.deadline_time > UNIX_TIMESTAMP() 
AND ol.product_manufacturer='$pro_man' 
0

@Ul rikMcArdle

爲什麼不是第一個查詢ORDER BY你在找什麼?

SELECT o.order_id, ol.product_manufacturer 
FROM orders o 
INNER JOIN order_lines ol ON o.order_id = ol.order_id 
WHERE o.deadline_time > UNIX_TIMESTAMP() 
ORDER ol.product_manufacturer, o.order_id 
0
SELECT ol.product_manufacturer 
FROM orders o 
INNER JOIN order_lines ol 
ON o.order_id = ol.order_id 
WHERE o.deadline_time > UNIX_TIMESTAMP() 
GROUP BY ol.product_manufacturer 

你可以使用某種UDF來Concat的所有的製造ORDER_ID。

Click here類似的UDF

相關問題