[英]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
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.