MySQL查詢in操作 查詢結(jié)果按in集合順序顯示
更新時(shí)間:2010年12月17日 09:43:07 作者:
MySQL 查詢in操作,查詢結(jié)果按in集合順序顯示的實(shí)現(xiàn)代碼,需要的朋友可以參考下。
MySQL 查詢in操作,查詢結(jié)果按in集合順序顯示
select * from test where id in(3,1,5) order by find_in_set(id,'3,1,5');
select * from test where id in(3,1,5) order by substring_index('3,1,2',id,1);
偶爾看到的。。?;蛟S有人會(huì)注意過(guò),但我以前真不知道
SQL: select * from table where id IN (3,6,9,1,2,5,8,7);
這樣的情況取出來(lái)后,其實(shí),id還是按1,2,3,4,5,6,7,8,9,排序的,但如果我們真要按IN里面的順序排序怎么辦?SQL能不能完成?是否需要取回來(lái)后再foreach一下?其實(shí)mysql就有這個(gè)方法
sql: select * from table where id IN (3,6,9,1,2,5,8,7) order by field(id,3,6,9,1,2,5,8,7);
出來(lái)的順序就是指定的順序了。。。。這個(gè),以前還真的從來(lái)沒(méi)用過(guò),偶爾看到,所以就記錄了一下。一是做個(gè)筆記,二是希望可以給更多的人看到
MySQL中NOT IN語(yǔ)句對(duì)NULL值的處理
mysql> SELECT COUNT(name) FROM CVE WHERE name NOT IN ('CVE-1999-0001', 'CVE-1999-0002');
+-------------+
| count(name) |
+-------------+
| 17629 |
+-------------+
1 row in set (0.02 sec)
mysql> SELECT COUNT(name) FROM CVE WHERE name NOT IN ('CVE-1999-0001', 'CVE-1999-0002', NULL);
+-------------+
| count(name) |
+-------------+
| 0 |
+-------------+
1 row in set (0.01 sec)
當(dāng)在子查詢中出現(xiàn)NULL的時(shí)候,結(jié)果就一定是0了。查了一下手冊(cè),確實(shí)有這樣的說(shuō)法。所以最后實(shí)際采用了這樣的查詢:
SELECT COUNT(DISTINCT name)
FROM CVE
WHERE name NOT IN (SELECT cveID FROM cve_sig WHERE cveID IS NOT NULL)
順便提一下MySQL中正則表達(dá)式匹配的簡(jiǎn)單使用:
SELECT COUNT(alarmID)
FROM Alarm
WHERE (CVE NOT RLIKE '^CVE-[0-9]{4}-[0-9]{4}$' OR CVE IS NULL)
當(dāng)然,RLIKE也可以寫(xiě)作REGEXP,我個(gè)人傾向于使用RLIKE,因?yàn)槠磳?xiě)接近LIKE,可以見(jiàn)名知義。
mysql - not in
table:info primary key(id, info_type_id)
id, info_type_id, programme_id, episode_id
3, 4, 382, 100034
3, 8, 382, 100034
4, 8, 382, 100034
6, 8, 382, 100034
7, 8, 382, 100034
8, 8, 382, 100034
9, 8, 382, 100034
10, 8, 382, 100034
11, 8, 382, 100034
12, 8, 382, 100034
13, 8, 382, 100034
100001, 4, 382, 100034
100002, 4, 382, 100034
排除(id=3 && info_type_id=8) and (id=4 && info_type_id=8)這兩條記錄,即找出其它記錄
error: select * from info where episode_id=100034 and id not in(3,4) and info_type_id not in (8);
error result:
id, info_type_id, programme_id, episode_id
100001, 4, 382, 100034
100002, 4, 382, 100034
correct: select * from info where episode_id=100034 and (id<>3 or info_type_id<>8) and (id<>4 or info_type_id<>8);
correct result:
id, info_type_id, programme_id, episode_id
3, 4, 382, 100034
6, 8, 382, 100034
7, 8, 382, 100034
8, 8, 382, 100034
9, 8, 382, 100034
10, 8, 382, 100034
11, 8, 382, 100034
12, 8, 382, 100034
13, 8, 382, 100034
100001, 4, 382, 100034
100002, 4, 382, 100034
理解:id<>3 or info_type_id<>8排除掉id=3 && info_type_id=8這條記錄,當(dāng)表中主鍵多于一個(gè)時(shí),不能簡(jiǎn)單地使用key1 NOT IN (……) AND key2 NOT IN (……) ..
復(fù)制代碼 代碼如下:
select * from test where id in(3,1,5) order by find_in_set(id,'3,1,5');
select * from test where id in(3,1,5) order by substring_index('3,1,2',id,1);
偶爾看到的。。?;蛟S有人會(huì)注意過(guò),但我以前真不知道
SQL: select * from table where id IN (3,6,9,1,2,5,8,7);
這樣的情況取出來(lái)后,其實(shí),id還是按1,2,3,4,5,6,7,8,9,排序的,但如果我們真要按IN里面的順序排序怎么辦?SQL能不能完成?是否需要取回來(lái)后再foreach一下?其實(shí)mysql就有這個(gè)方法
sql: select * from table where id IN (3,6,9,1,2,5,8,7) order by field(id,3,6,9,1,2,5,8,7);
出來(lái)的順序就是指定的順序了。。。。這個(gè),以前還真的從來(lái)沒(méi)用過(guò),偶爾看到,所以就記錄了一下。一是做個(gè)筆記,二是希望可以給更多的人看到
MySQL中NOT IN語(yǔ)句對(duì)NULL值的處理
mysql> SELECT COUNT(name) FROM CVE WHERE name NOT IN ('CVE-1999-0001', 'CVE-1999-0002');
+-------------+
| count(name) |
+-------------+
| 17629 |
+-------------+
1 row in set (0.02 sec)
mysql> SELECT COUNT(name) FROM CVE WHERE name NOT IN ('CVE-1999-0001', 'CVE-1999-0002', NULL);
+-------------+
| count(name) |
+-------------+
| 0 |
+-------------+
1 row in set (0.01 sec)
當(dāng)在子查詢中出現(xiàn)NULL的時(shí)候,結(jié)果就一定是0了。查了一下手冊(cè),確實(shí)有這樣的說(shuō)法。所以最后實(shí)際采用了這樣的查詢:
SELECT COUNT(DISTINCT name)
FROM CVE
WHERE name NOT IN (SELECT cveID FROM cve_sig WHERE cveID IS NOT NULL)
順便提一下MySQL中正則表達(dá)式匹配的簡(jiǎn)單使用:
SELECT COUNT(alarmID)
FROM Alarm
WHERE (CVE NOT RLIKE '^CVE-[0-9]{4}-[0-9]{4}$' OR CVE IS NULL)
當(dāng)然,RLIKE也可以寫(xiě)作REGEXP,我個(gè)人傾向于使用RLIKE,因?yàn)槠磳?xiě)接近LIKE,可以見(jiàn)名知義。
mysql - not in
table:info primary key(id, info_type_id)
id, info_type_id, programme_id, episode_id
3, 4, 382, 100034
3, 8, 382, 100034
4, 8, 382, 100034
6, 8, 382, 100034
7, 8, 382, 100034
8, 8, 382, 100034
9, 8, 382, 100034
10, 8, 382, 100034
11, 8, 382, 100034
12, 8, 382, 100034
13, 8, 382, 100034
100001, 4, 382, 100034
100002, 4, 382, 100034
排除(id=3 && info_type_id=8) and (id=4 && info_type_id=8)這兩條記錄,即找出其它記錄
error: select * from info where episode_id=100034 and id not in(3,4) and info_type_id not in (8);
error result:
id, info_type_id, programme_id, episode_id
100001, 4, 382, 100034
100002, 4, 382, 100034
correct: select * from info where episode_id=100034 and (id<>3 or info_type_id<>8) and (id<>4 or info_type_id<>8);
correct result:
id, info_type_id, programme_id, episode_id
3, 4, 382, 100034
6, 8, 382, 100034
7, 8, 382, 100034
8, 8, 382, 100034
9, 8, 382, 100034
10, 8, 382, 100034
11, 8, 382, 100034
12, 8, 382, 100034
13, 8, 382, 100034
100001, 4, 382, 100034
100002, 4, 382, 100034
理解:id<>3 or info_type_id<>8排除掉id=3 && info_type_id=8這條記錄,當(dāng)表中主鍵多于一個(gè)時(shí),不能簡(jiǎn)單地使用key1 NOT IN (……) AND key2 NOT IN (……) ..
您可能感興趣的文章:
相關(guān)文章
SQL實(shí)現(xiàn)相鄰兩行數(shù)據(jù)的加減乘除操作
這篇文章主要介紹了SQL實(shí)現(xiàn)相鄰兩行數(shù)據(jù)的加減乘除操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
MySQL的主從復(fù)制步驟詳解及常見(jiàn)錯(cuò)誤解決方法
這篇文章主要介紹了MySQL的主從復(fù)制步驟詳解及常見(jiàn)錯(cuò)誤解決方法,文中主張同步時(shí)跳過(guò)臨時(shí)錯(cuò)誤,并對(duì)Slave_IO_Running: No錯(cuò)誤的解決給出了方案,需要的朋友可以參考下2016-02-02
mysql Event Scheduler: Failed to open table mysql.event
這篇文章主要介紹了mysql Event Scheduler: Failed to open table mysql.event,需要的朋友可以參考下2016-04-04

