簡體   English   中英

SQL:按Column2降序選擇行,並且當Column1不為NULL時僅顯示1個結果

[英]SQL: Select Rows in Descending Order by Column2 and Only Show 1 Result When Column1 is not NULL

我有一張桌子:

ID-欄1-欄2-....

我想按Column2降序選擇所有行,其中Id = 1234且Column1為NULL:

SELECT * 
FROM my_table 
WHERE Id = 1234 AND Column1 is NULL 
ORDER BY column2 DESC 

1列在Column2中的最大值,其中Id = 1234,而Column1不為NULL:

SELECT * 
FROM my_table 
WHERE Id = 1234 AND Column1 is NOT NULL 
ORDER BY column2 DESC 
LIMIT 1

如何將這兩個SQL查詢合並為一個?

如果使用UNION ALL語句,則可以合並兩個不同的查詢結果。

UNION語句中的ALL選項不會刪除重復的行。 這是因為您也將在第一個查詢中獲得column2的最大值。

嘗試這個:

SELECT t.* FROM 
(SELECT id, column1, column2 
FROM my_table 
WHERE Id = 1234 AND Column1 is NULL 
UNION ALL
(SELECT id, column1, column2 
FROM my_table 
WHERE Id = 1234 AND Column1 is NOT NULL 
ORDER BY column2 DESC 
LIMIT 1)) as t
ORDER BY t.column2 DESC 

SQL小提琴

UNION語法:

UNION用於將來自多個SELECT語句的結果合並為一個結果集。

第一個SELECT語句中的列名用作返回結果的列名。 每個SELECT語句的相應位置中列出的所選列應具有相同的數據類型。 (例如,第一條語句選擇的第一列應與其他語句選擇的第一列具有相同的類型。)

讓我們為您要完成的工作建立一個演示表:

-- ----------------------------
-- Table structure for my_table
-- ----------------------------
DROP TABLE IF EXISTS `my_table`;
CREATE TABLE `my_table` (
  `Id` int(11) NOT NULL,
  `Column1` varchar(255) DEFAULT NULL,
  `column2` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of my_table
-- ----------------------------
INSERT INTO `my_table` VALUES ('1234', '5', '6');
INSERT INTO `my_table` VALUES ('1234', '6', '2');
INSERT INTO `my_table` VALUES ('1234', '7', '0');
INSERT INTO `my_table` VALUES ('1234', '8', '21');
INSERT INTO `my_table` VALUES ('1234', '9', '4');
INSERT INTO `my_table` VALUES ('1234', '12', '3');
INSERT INTO `my_table` VALUES ('1234', null, '8');
INSERT INTO `my_table` VALUES ('1234', null, '22');
INSERT INTO `my_table` VALUES ('1234', null, '19');
INSERT INTO `my_table` VALUES ('1234', null, '0');
INSERT INTO `my_table` VALUES ('1235', '15', '2');
INSERT INTO `my_table` VALUES ('1235', '8', '5');
INSERT INTO `my_table` VALUES ('1235', '7', '100');
INSERT INTO `my_table` VALUES ('1235', '2', '7');
INSERT INTO `my_table` VALUES ('1235', null, '1');
INSERT INTO `my_table` VALUES ('1235', null, '0');

現在,我們可以使用UNION合並您的兩個查詢,並在您的語句中刪除ORDER BY ,因為我們將其應用於UNION 我已經使用的通知MAX() ,以確定最大值column2 ,其中Column1不是NULL 這是我們得到的:

(SELECT * FROM `my_table` WHERE `Id` = '1234' AND `Column1` IS NULL)
UNION
(SELECT `Id`, `Column1`, MAX(`column2`) FROM `my_table` WHERE `Id` = '1234' AND `Column1` IS NOT NULL)
ORDER BY `column2` DESC

這給我們以下結果:

+------+---------+---------+
| Id   | Column1 | column2 |
+------+---------+---------+
| 1234 | NULL    |      22 |
| 1234 | 5       |      21 |
| 1234 | NULL    |      19 |
| 1234 | NULL    |       8 |
| 1234 | NULL    |       0 |
+------+---------+---------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM