我有下表:
| 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')
其中1
和d845f
是我在PHP中指定的参数。
因此,group = 1
总是有一行,但可以选择第二行,例如上面的例子,我的IN选项中有'd845f'
组。
因此,当我有两行时,我希望MySQL只显示其中一行:'d845f'
那我该怎么做呢?
我希望获得带有group = 1
参数的所有产品,但在group = 'd845f'
时,我只想获得一行:group = 'd845f'
。
我也想在没有嵌套SELECT的情况下这样做(允许JOINS)。
谢谢!
答案 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
将MAX
与IF
检查一起使用,以查看该特定产品是否存在记录。然后将这些结果加入原始表格。
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
的记录有不同的组。查询获取最大的组的行值