【问题标题】:sql query for Nested Count嵌套计数的sql查询
【发布时间】:2016-08-23 10:44:13
【问题描述】:

我有一个表,我在其中存储带有父引用的成员数据

如果 HU1 是父 ID,我的意思是 spos,我如何计算 HU1 下的总中间值和嵌套的子中间值

例如看到 HU5 在 HU1 下,而 HU6 在 HU5 下,那么我如何计算在父 HU1 下的总嵌套 MID 这里 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;

但它只显示 2 而不是 10

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

它也只显示 2 而不是 10

【问题讨论】:

  • 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
  • 和 "SELECT mid,spos,(SELECT count(unit) from member where spos=spos and spos='HU1')as totaspos from member where spos='HU1'" 它也只显示 2而不是 10
  • 请在您的问题中包含它:))
  • 查看stackoverflow.com/a/37288233/267540 以获得比递归查询更好的方法

标签: mysql sql


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是另一个想法......

    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 
    

    【讨论】:

      【解决方案3】:

      不使用 Sql 查询,但我使用函数管理它 我想分享整页代码,希望这会对某人有所帮助

      <!--#include file="mrraja.asp"-->
      <style>
      .propertyDetails td{text-align: left; padding-left: 1em;width: 10%;}
      a{cursor: pointer;}
      </style>	  
      <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
      %>		
      <div class="living_desc">
      				<a href="#" class="btn3">Full Team Detail</a>
      				<p class="price">Total Directs: <%=totdirme%></p>
      				</div>				
      <table border="1" class="propertyDetails">
                      <tbody>
                      <tr>
                         <td>MID</td>
                         <td>NAME</td>
                         <td>SPONSOR</td>
      				   <td>MOBILE</td>
                         <td>ACTIVE</td>
                         <td>COUNT</td>
      				</tr>   
      <%
          Dim countrec:countrec=0
      	Dim countunit:countunit=0
      	Dim unt:unt=0
      	Dim tunt:tunt=0			
      	call GET_HASAN(CStr(iam("mid")))			
      '===============  
      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  		
      Loop		   
      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  		
      Loop		  
      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
      %>
      				<tr>
                         <td><%=mid1%></td>
                         <td><%=fname%></td>
                         <td><%=snme%></td>
      				   <td><%=mob%></td>
                         <td><%=pkg%></td>
                         <td><%=countunit%></td>
      				</tr>  
      <%End Sub%>         
      				<tr>
                         <td colspan="2">Total: <%=tunt%></td>
      				   <td colspan="2">Active: <%=unt%></td>
      				   <td colspan="2">Inactive: <%=tunt-unt%></td>
      				</tr>              
          
                      </tbody></table>				
      			 </div>
      			</div>
            </div>
         </div></div>

      【讨论】:

        猜你喜欢
        • 2017-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多