2013-04-01 86 views
0

某行我有如下表:請根據我的病情

 
| id | product_id | price | group | 
| 1 | 123123  | 100 | 1  | 
| 2 | 123123  | 200 | d845f | 
| 3 | 91123  | 150 | 1  | 
| 4 | 2131238 | 100 | 1  | 
| 4 | 5678689 | 250 | 1  | 

所以我想選擇所有的價格其中組IN (1, 'd845f')。對於他們中的一些,只有一行輸出,就像

 
| 3 | 91123  | 150 | 1  | 

但對於一些有兩行:

 
| 1 | 123123  | 100 | 1  | 
| 2 | 123123  | 200 | d845f | 

我執行的東西選擇像

 
SELECT * FROM table WHERE `group` IN (1, 'd845f') 

其中1d845f是我在PHP中指定的參數。
因此,總有一行使用group = 1,但可以選擇使用上面示例中的第二行,並從我的IN選項中選擇組'd845f'
所以當我有兩行時,我希望MySQL只顯示其中的一個:'d845f'
那我該怎麼做呢?
我想用group = 1參數得到所有的產品,但是當group = 'd845f'我想只得到一行:用group = 'd845f'
我也想這樣做沒有嵌套SELECTs(JOINS允許)。 謝謝!

回答

-1

您可以使用CASE語句和LIMIT

SELECT group, product_id, price, id 
FROM table 
WHERE group IN (1, 'd845f') 
ORDER BY CASE WHEN group = 'd845f' THEN 0 ELSE 1 END 
LIMIT 1 
+0

它的工作原理,但只返回一個產品ID的結果,我還需要其他產品ID的其他行。 – konnigun

0

這個問題被稱爲Relational Division

SELECT a.* 
FROM TableName a 
     INNER JOIN 
     (
      SELECT product_ID 
      FROM tableName 
      WHERE `GROUP` IN ('1','d845f') 
      GROUP BY product_ID 
      HAVING COUNT(DISTINCT `GROUP`) = 2 
     ) b ON a.product_ID = b.product_ID 

輸出

╔════╦════════════╦═══════╦═══════╗ 
║ ID ║ PRODUCT_ID ║ PRICE ║ GROUP ║ 
╠════╬════════════╬═══════╬═══════╣ 
║ 1 ║  123123 ║ 100 ║ 1  ║ 
║ 2 ║  123123 ║ 200 ║ d845f ║ 
╚════╩════════════╩═══════╩═══════╝ 
0

如果我正確理解你的問題,你需要檢查的product_id有一組d845f在裏面,如果是這樣的話,用那個代替那個1。

這應該工作:

SELECT T.* 
FROM TableName T 
    JOIN (
    SELECT Product_Id, 
     MAX(IF(`GROUP`='d845f','d845f','1')) whichGroup 
    FROM TableName T 
    WHERE `GROUP` IN ('1','d845f') 
    GROUP BY Product_ID 
    ) T2 ON 
     T.Product_Id = T2.Product_Id AND T.`GROUP` = T2.whichGroup 

使用MAXIF檢查,看是否有記錄存在特定產品。然後將這些結果加入原始表格中。

SQL Fiddle Demo(從以前的海報借用)

-1

這裏有一個簡單的

SELECT 
    a.id, 
    a.product_id, 
    a.price, 
    a.`group` 
FROM 
    tablename a 
    LEFT JOIN tablename b ON (a.product_id = b.product_id 
         AND a.`group` <> b.`group`) 
WHERE 
    b.`group` IS NULL 
    OR length(a.`group`) > length(b.`group`) 

注:我還沒有加入的組是d845f我懷疑,有可能是2條記錄的條件相同的product_id有不同的羣體。該查詢獲取最大的組的行值

+0

我測試了它,當組是'32z3s''和'5'時,它仍然會返回5.如果組是'32z3s''和'2',它會返回''32z3s'',所以這個算法是不穩定的。 – konnigun

+0

@Konnigun你可以改變比較條件,我已經將它調整爲chk兩個組的長度,現在應該顯示具有最大字符的組的字符串長度 – Akash