Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用原始SQL查询按多对一关系数筛选查询集_Python_Mysql_Sql_Django_Sqlite - Fatal编程技术网

Python 使用原始SQL查询按多对一关系数筛选查询集

Python 使用原始SQL查询按多对一关系数筛选查询集,python,mysql,sql,django,sqlite,Python,Mysql,Sql,Django,Sqlite,我正在创建一个参考资料页面,我有以下模型: class Tag(models.Model): title = models.CharField(max_length=50, blank=False, unique=True, error_messages={'unique':"THis tag already exists."}) class Link(models.Model): title = models.CharField(max_length=100, blank=

我正在创建一个参考资料页面,我有以下模型:

class Tag(models.Model):
    title = models.CharField(max_length=50, blank=False, unique=True, error_messages={'unique':"THis tag already exists."}) 

class Link(models.Model):
    title = models.CharField(max_length=100, blank=False)
    tag = models.ForeignKey(Tag, on_delete=models.CASCADE, null=False, blank=False)
它们有更多的领域,但它们与这件事无关

这个参考资料页面的问题是,没有与它们建立关系的链接的标签仍然出现,我只希望下面至少有一个链接的标签出现

现在,我已经成功地通过这个queryset筛选实现了这一点:

tags = Tag.objects.all().filter(link__isnull=False).order_by("title").distinct()
在我的views.py中工作正常,我想要的已经完成了。请注意,distinct是必需的,这样它就不会返回重复的查询

我对MySQL几乎没有经验,只使用它和PHP构建了非常简单的应用程序。我现在已经知道它在SQLite下是如何工作的,我甚至不知道如何使用MySQL实现这一点

根据我的非正式逻辑,它的功能是这样的请原谅我扼杀了语言:

SELECT * FROM Tags WHERE NUMBER_OF_RELATIONSHIPS IS GREATER THAN 0

我的问题是,如何通过原始SQL查询实现这一点,无论是在SQLite还是MySQL下

您想获取具有多个关系(即链接)的所有标记,对吗?如果是这样,您可以将其用作原始SQL:

SELECT *
FROM <Tag_TableName>
WHERE <Tag_PK_Field> IN (
  -- Get Tag Ids with more than one entry in Link table
  SELECT <Tag_FK_Field>
  FROM <Link_TableName>
  HAVING COUNT(*) >= 1 -- Only return rows that have multiple entries per same tag
  GROUP BY <Tag_FK_Field>
)
如果这不起作用,您可能需要在另一个SELECT中包装内部SELECT,以便过滤出具有多个链接条目的标记

我认为Django将PK字段名默认为id,因此您实际的原始查询可能更接近于此:

SELECT *
FROM "<proj_name>_tag"
WHERE "id" IN (
  SELECT "id"
  FROM "<proj_name>_link"
  HAVING COUNT(*) >=1
  GROUP BY "id"
)

Django让我不用使用SQL,这让我有些烦恼。当然,这有助于提高工作效率,但我感觉像是在学习轮子上或是其他什么。是的,嗯,我的逻辑有一个缺陷。它实际上大于0,但您的想法非常适合。Django不能完全使用它,但现在我理解了它背后的逻辑,这就是我想要的。非常感谢。没问题:为什么不能和Django一起使用呢?我知道您对Django为了编写SQL而强加的训练轮的感觉。真烦人。