2016-08-23 252 views
0

我已经在那里我会员数据存储与父参考表为嵌套的SQL查询计数

enter image description here

如果HU1是父ID我的意思是SPOS我怎么算总中旬下HU1嵌套子中旬

例如看HU5正在HU1和HU6是HU5下,那我怎么算总嵌套MID为根据父HU1 这里总计数下HU1是10我如何得到这个从SQL查询

我的MySQL使用5.0

我试图

SELECT parent.mid, COUNT(child.mid) AS child_count FROM member parent INNER JOIN member child ON child.spos = parent.mid WHERE child.spos = 'HU1' GROUP BY parent.mid; 

但其仅示出而不是10

SELECT mid,spos,(SELECT count(unit) from member where spos=spos and spos='HU1')as totaspos from member where spos='HU1' 

2其也仅示出2代替10

+0

你试过了什么? –

+0

SELECT parent.mid,COUNT(child.mid)AS child_count FROM member parent INNER JOIN member child ON child.spos = parent.mid WHERE child.spos ='HU1'GROUP BY parent.mid;但它仅显示2而不是10 – MRRaja

+0

和“SELECT mid,spos,(从spos = spos和spos ='HU1'的成员中选择计数(单元))作为来自spos ='HU1'的成员的totaspos”显示只有2而不是10 – MRRaja

回答

0

与SQL查询,但我有Manged它使用功能 我想分享完整的网页代码,希望这能帮助别人

<!--#include file="mrraja.asp"--> 
 
<style> 
 
.propertyDetails td{text-align: left; padding-left: 1em;width: 10%;} 
 
a{cursor: pointer;} 
 
</style> \t 
 
<div class="container"> 
 
<div class="col-md-12 wow fadeInLeft" data-wow-delay="0.4s"> 
 
<div class="living_box" style="height: 30em;overflow: auto;"> 
 
<% 
 
Set allspos=TheDB.Execute("SELECT COUNT(*) as totdir FROM member where spos='"&iam("mid")&"' ORDER BY sl asc") 
 
if not allspos.eof=true then 
 
totdirme=allspos("totdir") 
 
else 
 
totdirme=0 
 
end if 
 
%> \t \t 
 
<div class="living_desc"> 
 
\t \t \t \t <a href="#" class="btn3">Full Team Detail</a> 
 
\t \t \t \t <p class="price">Total Directs: <%=totdirme%></p> 
 
\t \t \t \t </div> \t \t \t \t 
 
<table border="1" class="propertyDetails"> 
 
       <tbody> 
 
       <tr> 
 
        <td>MID</td> 
 
        <td>NAME</td> 
 
        <td>SPONSOR</td> 
 
\t \t \t \t <td>MOBILE</td> 
 
        <td>ACTIVE</td> 
 
        <td>COUNT</td> 
 
\t \t \t \t </tr> 
 
<% 
 
    Dim countrec:countrec=0 
 
\t Dim countunit:countunit=0 
 
\t Dim unt:unt=0 
 
\t Dim tunt:tunt=0 \t \t \t 
 
\t call GET_HASAN(CStr(iam("mid"))) \t \t \t 
 
'=============== 
 
Public Sub GET_HASAN(MRRAJA) 
 
sel = " SELECT mid FROM member where spos='" & MRRAJA & "' order by mid asc " 
 
Set rs = TheDB.Execute(sel) 
 
Do while Not rs.eof=true 
 
If Not rs.EOF = True Then 
 
l = rs.Fields(0) 
 
Else 
 
l = 0 
 
End If 
 
Call GET_IDEA1((l)) 
 
rs.MoveNext \t \t 
 
Loop \t \t  
 
rs.Close 
 
Set rs = Nothing   
 
End Sub 
 
'------------------------------  
 
Public Sub GET_IDEA1(MRRAJA)     
 
call SET_ME(CStr(MRRAJA)) 
 
sel = " SELECT mid FROM member where spos='" & MRRAJA & "' order by mid asc " 
 
Set rs = TheDB.Execute(sel) 
 
Do while Not rs.eof=true 
 
If Not rs.EOF = True Then 
 
l = rs.Fields(0) 
 
Call GET_IDEA1((l)) 
 
Else 
 
l = 0 
 
levelL=levelL+1 
 
End If 
 
rs.MoveNext \t \t 
 
Loop \t \t 
 
rs.Close 
 
Set rs = Nothing 
 
End Sub 
 
    '=============== 
 
Public Sub SET_ME(MRRAJA) 
 
sel = " SELECT * FROM member where mid='" & MRRAJA & "' order by mid asc " 
 
Set rs = TheDB.Execute(sel) 
 
If Not rs.EOF = True Then 
 
mid1=cstr(rs("mid")) 
 
fname=rs("fullname") 
 
snme=rs("spos") 
 
sps=rs("spos") 
 
mob=rs("mob") 
 
address=(rs("addrs"))+" "+(rs("city"))+" "+(rs("dist")) 
 
pkg=rs("act") 
 
if pkg="YES" then 
 
countunit=1 
 
unt=unt+rs("unit") 
 
else 
 
countunit=0 
 
unt=unt 
 
end if 
 
tunt=tunt+rs("unit") 
 
mob=rs("mob") 
 
End if 
 
rs.close 
 
Set rs = Nothing 
 
%> 
 
\t \t \t \t <tr> 
 
        <td><%=mid1%></td> 
 
        <td><%=fname%></td> 
 
        <td><%=snme%></td> 
 
\t \t \t \t <td><%=mob%></td> 
 
        <td><%=pkg%></td> 
 
        <td><%=countunit%></td> 
 
\t \t \t \t </tr> 
 
<%End Sub%>   
 
\t \t \t \t <tr> 
 
        <td colspan="2">Total: <%=tunt%></td> 
 
\t \t \t \t <td colspan="2">Active: <%=unt%></td> 
 
\t \t \t \t <td colspan="2">Inactive: <%=tunt-unt%></td> 
 
\t \t \t \t </tr>    
 
    
 
       </tbody></table> \t \t \t \t 
 
\t \t \t </div> 
 
\t \t \t </div> 
 
     </div> 
 
    </div></div>

0

我会在数据库之外以编程方式执行该操作,直到n获取整个表或新行o找到孩子。

这是可能的,因为有一个已知的最大树深度,但它是一个非常昂贵的操作。你基本上必须将自己的表格加入到与最大深度相同的次数。

0

这里的另一个想法...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(spos VARCHAR(12) NOT NULL PRIMARY KEY 
,lft INT NOT NULL 
,rgt INT NOT NULL 
); 

INSERT INTO my_table VALUES 
('HU1' ,1,22), 
('HU2' ,2,3), 
('HU3' ,4,5), 
('HU4' ,6,7), 
('HU5' ,8,21), 
('HU6' ,9,20), 
('HU7' ,10,19), 
('HU8' ,11,18), 
('HU9' ,12,17), 
('HU10',13,16), 
('HU11',14,15); 

SELECT COUNT(*) 
    FROM my_table x 
    JOIN my_table y 
    ON y.lft > x.lft 
    AND y.rgt < x.rgt 
WHERE x.spos = 'HU1'; 

+----------+ 
| COUNT(*) | 
+----------+ 
|  10 | 
+----------+ 
1 row in set