首页 > 解决方案 > 如果检查的第一列中的两行相同,我如何使用另一列?

问题描述

我有一个看起来像这样的表:

石头

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
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

标签: mysqlsql

解决方案


错误在END AS number OR snumber。删除后OR snumber,不会有任何错误,但也不会有任何结果;根据您提供的示例数据。尝试更改WHERE x.totalrows = 1 AND wt >= 2.5WHERE wt >= 2.5only 因为您已经在做一个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值的子查询,该值符合snumberOP 要求。然后,我用CASE它来做检查,最后用HAVING它从检查中过滤掉它们。

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=40cb88da028a42dc147dc4224154ab05


推荐阅读