Mysql检查值是否相同

时间:2016-05-06 07:40:29

标签: mysql sql database relational-database

我从表中获取记录并返回一组混合数据

这是一个简单的查询

SELECT code_id, atb_name_id FROM `attribute_combinations` WHERE products_id =109

它返回我这样的数据

| code_id |atb_name_id|
-----------------------
| 1       |    31     |
| 2       |    31     |
| 3       |    31     |
| 4       |    31     |
| 5       |    31     |
| 6       |    34     |
| 7       |    34     |
| 8       |    34     |
| 9       |    34     |

我想创建另一个别名“flag”,如果“atb_name_id”列具有所有相同的值,否则所有值都将填充为“yes”,否则将填充“no”。

在上面的示例中,“atb_name_id”的设置为31和34,因此输出将为

| code_id |atb_name_id| flag |
------------------------------
| 1       |    31     | no   | 
| 2       |    31     | no   |
| 3       |    31     | no   |
| 4       |    31     | no   |
| 5       |    31     | no   |
| 6       |    34     | no   |
| 7       |    34     | no   |
| 8       |    34     | no   |
| 9       |    34     | no   |

4 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

SELECT code_id, atb_name_id,
       (SELECT CASE WHEN COUNT(DISTINCT atb_name_id) > 1 THEN 'no' ELSE 'yes' END
        FROM `attribute_combinations` ac2
        WHERE products_id = ac.products_id) AS flag
FROM `attribute_combinations` ac
WHERE products_id =109

答案 1 :(得分:0)

尝试使用 select distinct ... 我希望它能很好地运作。

答案 2 :(得分:0)

使用CASE表达式。

<强>查询

SELECT code_id, atb_name_id, 
CASE WHEN (SELECT COUNT(DISTINCT atb_name_id) 
           FROM attribute_combinations WHERE products_id =109
 ) > 1 
THEN 'no' ELSE 'yes' END AS flag
FROM attribute_combinations
WHERE products_id =109;

答案 3 :(得分:0)

在子选择中生成附加信息,您只需加入原始表:

SELECT
    ac.code_id,
    ac.atb_name_id,
    CASE WHEN f.count = 1 THEN 'yes'
         ELSE 'no' END AS flag
FROM
    attribute_combinations ac INNER JOIN
    (SELECT
        products_id,
        COUNT(DISTINCT atb_name_id) AS count
    FROM
        attribute_combinations
    GROUP BY
        products_id) f ON ac.products_id = f.products_id
WHERE
   ac.products_id = 109

注意:我还没有测试过这段代码。它只是给你一个想法,可能包含错误。

由于MySQL查询优化器并不总是最好的,因此您可以通过将子选择的结果限制为仅对您感兴趣的产品来获得更好的性能:

SELECT
    ac.code_id,
    ac.atb_name_id,
    CASE WHEN f.count = 1 THEN 'yes'
         ELSE 'no' END AS flag
FROM
    attribute_combinations ac,
    (SELECT
        COUNT(DISTINCT atb_name_id) AS count
    FROM
        attribute_combinations
    WHERE
       products_id = 109) f
WHERE
   ac.products_id = 109