A. Mysql怎樣做遞歸查詢
mysql的逆襲:如何做遞歸層次查詢
最近在做一個從oracle資料庫到mysql資料庫的移植,遇到一個這樣的問題
在Oracle 中我們知道有一個 Hierarchical Queries 通過CONNECT BY 我們可以方便的查了所有當前節點下的所有子節點。但shi,在MySQL的目前版本中還沒有對應的函數!!!
換句話來說,想要用mysql實現遞歸查詢,根本做不到!!!
可是經過我數天茶不思飯不想的刻苦琢磨,終於想到了一個合理的,適用於mysql和其他sql的解決方案。
方案一出,就秋風掃落葉之勢,席捲整個層~~~所到之處,所有問題迎刃而解,讓所有問題都不再為問題 都成為了我這個函數的炮灰而已。。。
B. mysql foreach和遞歸查詢嵌套怎麼寫
我給你舉個遞歸查詢嵌套的例子,你看一下就明白了。
select yr_student_info.name from yr_student_info where yr_student_info.school_id in (select yr_school_info.id from yr_school_info where yr_school_info.province='上海' and yr_school_info.city='上海')
C. mysql 實現遞歸查詢,節點有多個
[sql] view plain
CREATE FUNCTION `getChildList`(rootId INT)
RETURNS varchar(1000)
BEGIN
DECLARE sChildList VARCHAR(1000);
DECLARE sChildTemp VARCHAR(1000);
SET sChildTemp =cast(rootId as CHAR);
WHILE sChildTemp is not null DO
IF (sChildList is not null) THEN
SET sChildList = concat(sChildList,',',sChildTemp);
ELSE
SET sChildList = concat(sChildTemp);
END IF;
SELECT group_concat(id) INTO sChildTemp FROM user_role where FIND_IN_SET(parentid,sChildTemp)>0;
END WHILE;
RETURN sChildList;
END;
[sql] view plain
/*獲取子節點*/
[sql] view plain
D. sql語句實現遞歸查詢所有節點,mysql和oracle都能用的
首先說一下Oracle的遞歸查詢,相信大部分人都知道很簡單。無非start with connect by 函數。下面是從pId向子節點遞歸查詢的例子,unId是資料庫表中的主鍵。
如果是從子節點遞歸到父節點查詢,就把start with 換成unid,prior左右對換
下面再講MySql 的遞歸查詢方式。MySql沒有Oracle的強大功能,雖然都是同一個公司的產品。所以只能靠自己寫。有很多方法,用sql去循環查詢,或者寫存儲過程,我這里只提供一種。就是新建一個function函數。
表結構不說了,無非就是 Id ,pId,其他列。下面是創建一個遞歸查詢子節點的函數
DROP FUNCTION IF EXISTS queryChildrenPowerInfo;
CREATE FUNCTION `queryChildrenPowerInfo` (powerId VARCHAR(2000))
RETURNS VARCHAR(2000)
BEGIN
DECLARE sTemp VARCHAR(2000);
DECLARE sTempChd VARCHAR(2000);
SET sTemp = '$';
SET sTempChd = cast(powerId as CHAR);
WHILE sTempChd is not NULL DO
SET sTemp = CONCAT(sTemp, ',', sTempChd);
SELECT group_concat(id) INTO sTempChd FROM t_discretionary_power where FIND_IN_SET(pId,sTempChd)>0;
END WHILE;
return sTemp;
調用的時候:select queryChildrenPowerInfo(""); 該語句會返回Id和父Id等於傳入參數powerId的一個字元串,中間有逗號隔開如圖
下面這句代碼的意思是,查詢出 t_discretionary_power 表中,t.id 等於上面查詢出的結果集的數據。FIND_IN_SET(A,B)是MYSQL的函數。意思是查找在B集合中有A的數據。相當於In
select t.* from t_discretionary_power t where FIND_IN_SET(t.id,queryChildrenPowerInfo(''))
E. mysql如何遞歸匯總
單表自身關聯查詢,關聯條件就是父節點pcode和code相等,查詢欄位包含pcode和sorce,將查詢結果作為新表按pcode分組,用group by,查詢欄位是count記錄數,這樣就獲取pcode的節點值,這是整體思路
F. mysql遞歸查詢
你這個表設計有問題, 重設計個表pid 為院系 下級為班級
暫時想這么多,自己考慮吧
G. mysql查詢一個表,實現遞歸查詢
給你個網上寫的比較好的例子:
方法一:利用函數來得到所有子節點號。
創建一個function getChildLst, 得到一個由所有子節點號組成的字元串.
mysql> delimiter //
mysql>
mysql> CREATE FUNCTION `getChildLst`(rootId INT)
-> RETURNS varchar(1000)
-> BEGIN
-> DECLARE sTemp VARCHAR(1000);
-> DECLARE sTempChd VARCHAR(1000);
->
-> SET sTemp = '$';
-> SET sTempChd =cast(rootId as CHAR);
->
-> WHILE sTempChd is not null DO
-> SET sTemp = concat(sTemp,',',sTempChd);
-> SELECT group_concat(id) INTO sTempChd FROM treeNodes where FIND_IN_SET(pid,sTempChd)>0;
-> END WHILE;
-> RETURN sTemp;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> delimiter ;
使用我們直接利用find_in_set函數配合這個getChildlst來查找
mysql> select getChildLst(1);
+-----------------+
| getChildLst(1) |
+-----------------+
| $,1,2,3,4,5,6,7 |
+-----------------+
1 row in set (0.00 sec)
mysql> select * from treeNodes
-> where FIND_IN_SET(id, getChildLst(1));
+----+----------+------+
| id | nodename | pid |
+----+----------+------+
| 1 | A | 0 |
| 2 | B | 1 |
| 3 | C | 1 |
| 4 | D | 2 |
| 5 | E | 2 |
| 6 | F | 3 |
| 7 | G | 6 |
+----+----------+------+
7 rows in set (0.01 sec)
mysql> select * from treeNodes
-> where FIND_IN_SET(id, getChildLst(3));
+----+----------+------+
| id | nodename | pid |
+----+----------+------+
| 3 | C | 1 |
| 6 | F | 3 |
| 7 | G | 6 |
+----+----------+------+
3 rows in set (0.01 sec)
H. mysql遞歸查詢連續時間的個數,在線等。
SELECT COUNT(*) FROM tablename WHERE (username = 'Jack') and
(DATE_ADD(sign_date, INTERVAL 1 DAY) IN
(SELECT sign_date FROM tablename WHERE (username = 'Jack'))
)
這里么有考慮5號星期五簽到8號星期一簽到也是連續簽到的情況,拋磚引玉,你已經可以完成了。
你可以需要用到的函數:DAYOFWEEK
I. mysql遞歸查詢語句
mysql遞歸查詢,mysql中從子類ID查詢所有父類(做無限分類經常用到)
由於mysql 不支持類似 oracle with ...connect的 遞歸查詢語法
之前一直以為類似的查詢要麼用存儲過程要麼只能用程序寫遞歸查詢.
現在發現原來一條sql語句也是可以搞定的
先來看數據表的結構如下:
id name parent_id
---------------------------
1 Home 0
2 About 1
3 Contact 1
4 Legal 2
5 Privacy 4
6 Procts 1
7 Support 1
我要的要求是根據一個分類ID(這個分類ID可能是一個子分類),得到所有的父分類,下面是相應的SQL:
SELECT T2.id, T2.name
FROM (
SELECT
@r AS _id,
(SELECT @r := parent_id FROM table1 WHERE id = _id) AS parent_id,
@l := @l + 1 AS lvl
FROM
(SELECT @r := 5, @l := 0) vars,
table1 h
WHERE @r <> 0) T1
JOIN table1 T2
ON T1._id = T2.id
ORDER BY T1.lvl DESC
代碼@r := 5標示查詢id為5的所有父類。結果如下
1, 『Home』
2, 『About』
4, 『Legal』
5, 『Privacy』
自己仿照這看一下!
J. java1.8使用mytis連接mysql遞歸查詢所有父節點用到:和@報錯Cause: java.util.NoSuchElementException
Java mysql mybatis批量更新資料庫,採用以下寫法即可執行,但是資料庫連接必須配置:&allowMultiQueries=true
例如:jdbc:mysql://192.168.1.236:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
<updateid="batchUpdate"parameterType="java.util.List">
<foreachcollection="list"item="item"index="index"open=""close=""separator=";">
updatetest
<set>
test=${item.test}+1
</set>
whereid=${item.id}
</foreach>
</update>
MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis使用簡單的XML或註解用於配置和原始映射,將介面和Java的POJOs(Plan Old Java Objects,普通的Java對象)映射成資料庫中的記錄.