Django - 得到字段A的总和,其中字段B等于字段B或字段C,超过多行?

时间:2015-08-08 03:29:37

标签: python mysql django

+-------------------+-------------------+----------+
| mac_src           | mac_dst           | bytes_in |
+-------------------+-------------------+----------+
| aa:aa:aa:aa:aa:aa | bb:bb:bb:bb:bb:bb |       10 |
| bb:bb:bb:bb:bb:bb | aa:aa:aa:aa:aa:aa |       20 |
| cc:cc:cc:cc:cc:cc | aa:aa:aa:aa:aa:aa |       30 |
+-------------------+-------------------+----------+

我的表格包含字段mac_srcmac_dstbytes_in

我需要获取表格中存在的每个mac_src值存在于mac_srcmac_dst中的所有行。然后我需要所有这些行的字段bytes_in的总和。

我希望获得字段bytes_inmac_src相等的所有行的字段mac_dst的总和,然后将此总和从最高到最低排序。

返回的Queryset每个mac_src只有一个条目。

感谢。

1 个答案:

答案 0 :(得分:0)

我不认为只用Django ORM就可以做到这一点。只需编写一个SQL查询(警告:未经测试且可能在下面缓慢的SQL):

from django.db import connection

with connection.cursor() as cursor:
    cursor.execute('''
        SELECT mac, SUM(total) FROM (
                      (SELECT mac_src AS mac, SUM(bytes_in) AS total FROM your_table GROUP BY mac_src)
            UNION ALL (SELECT mac_dst AS mac, SUM(bytes_in) AS total FROM your_table WHERE mac_src != mac_dst GROUP BY mac_dst)
        ) AS combined_rows GROUP BY mac
    ''')

    counts = dict(cursor.fetchall())  # {mac1: total_bytes1, ...}