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 | 但对于一些人来说,有两行: | 1 | 123123 | 100 | 1 | | 2 | 123123 | 200 | d845f | | 1 | 123123 | 100 | 1 | |2 | 123123 | 200 | d845f| 我用类似于 SELECT * FROM table WHERE `group` IN (1, 'd845f') 从(1,'d845f'中'group'所在的表中选择*) 其中Mysql 根据我的条件选择某一行,mysql,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 | 但对于一
1
和d845f
是我在PHP中指定的设置参数。因此,始终有一行
group=1
,但也可以选择第二行,如上面示例中的“我的输入”选项中的“组'd845f'
。因此,当我有两行时,我希望MySQL只显示其中一行:带有
'd845f'
那我该怎么做呢?
我希望获得所有带有
group=1
参数的产品,但当group='d845f'
时,我只希望获得一行:带有group='d845f'
我还希望在没有嵌套选择的情况下执行此操作(允许连接)。
谢谢 您可以使用带有限制的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
这个问题称为
关系划分
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 ║
╚════╩════════════╩═══════╩═══════╝
如果我正确理解了您的问题,您需要检查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
检查是否存在该特定产品的记录。然后将这些结果合并到原始表中
(从以前的海报中借用)这里有一个简单的例子
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`)
选择
a、 身份证,
a、 产品标识,
a、 价格,
a、 “组`
从…起
表名a
左联接表名b ON(a.product\U id=b.product\U id
和a.`group`b.`group`)
哪里
b、 `group`为空
或长度(a.`group`)>长度(b.`group`)
注意:我没有添加组为
d845f
的条件,因为我怀疑同一产品id
可能有两条记录具有不同的组。该查询获取组的行值,该行值最大它可以工作,但只返回一个产品id的结果,我还需要其他行来显示其他产品id。我对其进行了测试,当组为'32z3s'
和5
时,它仍将返回5。如果组是'32z3s'
和2
它将返回'32z3s'
,因此此算法不稳定。@Konnigun您可以更改比较条件,我已将其调整为chk两个组的长度,现在将显示具有最大字符的组的字符串长度
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`)