我从表中获取记录并返回一组混合数据
这是一个简单的查询
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 |
答案 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