Mysql下的判断
我最近再做一个Django页面,这个页面主要是展现“攻防演习”的一个细节,判断攻击方一共攻击了多少个场景,如图:
可见practice_scene
和app
都不同才能算是一个不同的场景,如果他俩相同就是同一个场景,因为攻击方是可以重复攻击同一个场景的。那么如何输出practice_scene
和app
都不同的列?
写法很简单:SELECT * FROM naxxramas_cappractice where bluearmy_id =6 GROUP BY practice_scene, app ORDER BY id DESC
,效果如图:
可见practice_scene
和app
相同的列已经整合成一个,只暴露了ID比较靠前的那一行。
而现在我想要得到的是行数,那就SELECT count(*) FROM naxxramas_cappractice where bluearmy_id = 6 GROUP BY practice_scene, app ORDER BY id DESC
吧,很不幸,答案是错的,如图:
可见这样是把每一个类型的行数输出了,而我想要的只是一个3,怎么办?
答案是:SELECT count(DISTINCT app,practice_scene) FROM naxxramas_cappractice where bluearmy_id =6;
就搞定了,如图:
Django 里的判断
Django的views.py
如何通过models来得到上面的“3”呢?如果是Django 1.X
的话,可以使用CAPPractice.objects.filter(bluearmy_id = 6).distinct('practice_scene, app')
或者是 CAPPractice.objects.values('Category').distinct()
。(CAPPractice是naxxramas_cappractice对应的model)
但是这个方法在2.2里已经不能使用了,会爆django.db.utils.NotSupportedError: DISTINCT ON fields is not supported by this database backend
,这里我们改一下,CAPPractice.objects.filter(bluearmy_id=6).values('app', "practice_scene").distinct().count()
就好了,然后直接在前端页面直接引用变量即可。
参考资料
https://stackoverflow.com/questions/3852104/select-distinct-individual-columns-in-django
https://www.cnblogs.com/cpl9412290130/p/11777633.html
https://blog.csdn.net/qq_36815739/article/details/83624100