Django中的SQL查询按先前的查询过滤

时间:2017-05-01 01:12:40

标签: python django sqlite django-queryset

我正在尝试在python中找到常见事件。 我已设法进行查询,但必须有更好的方法,你能评论一下吗?

Id     date     event
31  2016-10-05  1
44  2016-10-07  1
32  2016-10-05  2
36  2016-10-06  2
45  2016-10-07  2
33  2016-10-05  3
41  2016-10-07  3
34  2016-10-05  4
37  2016-10-06  4
43  2016-10-07  4
35  2016-10-05  5
38  2016-10-06  6
42  2016-10-07  6
39  2016-10-06  8
40  2016-10-06  10

此查询执行Thing:

select A.event as nA, B.event as nB, C.event as nC, count(C.event) as count
from event as A, event as B, event as C
where A.date = B.date
and B.date=C.date
and nA=1
and nB=2
and nC<>nA
and nC<>nB
group by (nC)

结果:

nA  nB  Nc  count
1   2   5   1
1   2   6   1
1   2   3   2
1   2   4   2

但是在python中我的代码和以下一样糟糕:

(这是一个施加)

            b1 = event1
            b2 = event2
            b3 = event3
            q1 = (events.objects.filter(event=b1))

            for r1 in q1: #q1 contains all dates for event1
                d1 = r1.dates
                q2 = (events.objects.filter(dates=d1).filter(event=b2))

                for r2 in q2: #q2 contains all comun dates
                    d2 = r2.dates
                    q3 = (events.objects.filter(dates=d2).filter(event=b3))

                for r3 in q3: #q3 contains all common dates
                        d3 = r3.dates
                        tmp = events.objects.filter(dates=d3).values('event').exclude(event=b2).exclude(
                        event=b1).exclude(event=b3) #events on common dates

                    for t in tmp: # makes da count, and formats to dic format
                            if t.get('event') in eventList:
                                eventList[t.get('event')] += 1
                            else:
                                eventList[t.get('event')] = 1

模特:

class events(models.Model):
    event = models.PositiveSmallIntegerField(primary_key=False)
    date = models.DateField(auto_now=False, auto_now_add=False)

在SQLite中创建的表构造      -

PRAGMA foreign_keys = off;
BEGIN TRANSACTION;

-- Table: event
CREATE TABLE event (id integer NOT NULL PRIMARY KEY AUTOINCREMENT, date date NOT NULL, event smallint unsigned NOT NULL);
INSERT INTO event (id, date, event) VALUES (31, '2016-10-05', 1);
INSERT INTO event (id, date, event) VALUES (32, '2016-10-05', 2);
INSERT INTO event (id, date, event) VALUES (33, '2016-10-05', 3);
INSERT INTO event (id, date, event) VALUES (34, '2016-10-05', 4);
INSERT INTO event (id, date, event) VALUES (35, '2016-10-05', 5);
INSERT INTO event (id, date, event) VALUES (36, '2016-10-06', 2);
INSERT INTO event (id, date, event) VALUES (37, '2016-10-06', 4);
INSERT INTO event (id, date, event) VALUES (38, '2016-10-06', 6);
INSERT INTO event (id, date, event) VALUES (39, '2016-10-06', 8);
INSERT INTO event (id, date, event) VALUES (40, '2016-10-06', 10);
INSERT INTO event (id, date, event) VALUES (41, '2016-10-07', 3);
INSERT INTO event (id, date, event) VALUES (42, '2016-10-07', 6);
INSERT INTO event (id, date, event) VALUES (43, '2016-10-07', 4);
INSERT INTO event (id, date, event) VALUES (44, '2016-10-07', 1);
INSERT INTO event (id, date, event) VALUES (45, '2016-10-07', 2);

COMMIT TRANSACTION;
PRAGMA foreign_keys = on;

感谢;

0 个答案:

没有答案