Mysql 根据我的条件选择某一行

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 | 但对于一

我有下表:

| 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'所在的表中选择*) 其中
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`)