根据我的条件选择某一行

时间:2013-04-01 15:42:45

标签: mysql

我有下表:

| 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'
我也想在没有嵌套SELECT的情况下这样做(允许JOINS)。 谢谢!

4 个答案:

答案 0 :(得分: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 ║
╚════╩════════════╩═══════╩═══════╝

答案 1 :(得分: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(借用之前的海报)

答案 2 :(得分:-1)

您可以使用带有LIMIT的CASE语句

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

答案 3 :(得分:-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的记录有不同的组。查询获取最大的组的行值

相关问题