mysql - 如果检查的第一列中的两行相同,我如何使用另一列?
问题描述
我有一个看起来像这样的表:
石头
ID | 数字 | 号码 | 重量 | qt |
---|---|---|---|---|
1 | 一个 | 11.5 | 13 | |
2 | C | 4.0 | 8 | |
3 | 一个 | a1 | 1.0 | 2 |
4 | d | 0.5 | 1 | |
5 | b | 2.0 | 4 | |
6 | 一个 | a2 | 5.0 | 1 |
7 | F | 3.0 | 6 | |
8 | 一个 | a3 | 5.0 | 10 |
我如何从石头中选择所有,如果列号在snumber列中有行,则只给出snumber行的结果[否则使用number ]?
我还试图合并到我以前的 [工作] 代码中,该代码选择表中wt >= 2.5 的所有行,然后将所有这些行计为totalrows:
SELECT inv.*, COUNT(*) OVER() AS totalrows FROM stones inv WHERE wt >= 2.5
- 因此,从上面的示例中,我想显示以下行c、 a2、f和a3且totalrows = 4:
ID | 数字 | 号码 | 重量 | qt | 总行 |
---|---|---|---|---|---|
2 | C | 4.0 | 8 | 4 | |
6 | 一个 | a2 | 5.0 | 1 | 4 |
7 | F | 3.0 | 6 | 4 | |
8 | 一个 | a3 | 5.0 | 10 | 4 |
尝试失败
我尝试了这些,但我的 PHP 出现错误,所以我假设 SQL 存在问题:
第一
SELECT stones.*,
CASE
WHEN x.totalrows > 1
THEN stones.snumber
ELSE stones.number
END AS numberORsnumber
FROM stones
JOIN (
SELECT number, COUNT(*) AS totalrows FROM stones
GROUP BY number
) x ON x.number = stones.number
WHERE x.totalrows = 1 OR stones.snumber <> '' AND wt >= 2.5
第二
SELECT inv.*, COUNT(*) OVER() AS totalrows FROM stones inv
CASE
WHEN totalrows > 1
THEN inv.snumber
ELSE inv.number
END AS number
WHERE wt >= 2.5
解决方案
错误在END AS number OR snumber
。删除后OR snumber
,不会有任何错误,但也不会有任何结果;根据您提供的示例数据。尝试更改WHERE x.totalrows = 1 AND wt >= 2.5
为WHERE wt >= 2.5
only 因为您已经在做一个CASE
表达式:
CASE
WHEN x.totalrows > 1
THEN stones.snumber
ELSE stones.number
END AS number
所以添加WHERE x.totalrows = 1
不会从CASE
.
更新:
好吧,经过长时间的评论讨论,我想我明白了:
SELECT inv.ID,
CASE WHEN inv.snumber <> ""
THEN inv.snumber ELSE inv.number
END AS numberORSnumber,
inv.wt,
inv.qt,
COUNT(*) OVER() AS totalrows,
CASE WHEN inv.number=v.number
AND inv.snumber="" THEN 0 ELSE 1 END AS Checking
FROM stones inv
CROSS JOIN
(SELECT number FROM stones WHERE snumber <> "" group by number) v
WHERE wt >= 2.5
HAVING Checking <> 0
ORDER BY ID ASC;
我最终添加了一个CROSS JOIN
带有返回number
值的子查询,该值符合snumber
OP 要求。然后,我用CASE
它来做检查,最后用HAVING
它从检查中过滤掉它们。
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=40cb88da028a42dc147dc4224154ab05
推荐阅读
- ios - 如何从 UIImagePickerController 获取具有最长持续时间的视频
- email - 发送一封我不希望收到的电子邮件
- html - Bootstrap 4:将自定义复选框浮动到文本右侧
- python - 跨多个分组重复使用相同的查询?
- javascript - Array with nested Object in TypeScript?
- c# - 如何将数组反序列化为包装对象?
- javascript - Angular 7 动画触发器导致控制台错误
- google-apps-script - 如何让单元格每 x 秒改变一次颜色?
- windows - How can I create Windows 10 Tiles for Apps, Folders, Websites and more?
- haskell - Why doesn't Gloss render in native resolution?