Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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
Mysql 在主键以外的字段上连接到另一个表_Mysql_Sql_Django_Django Models - Fatal编程技术网

Mysql 在主键以外的字段上连接到另一个表

Mysql 在主键以外的字段上连接到另一个表,mysql,sql,django,django-models,Mysql,Sql,Django,Django Models,假设我有Table\u A,我想将它加入Table\u B的两个字段中,school\u id和type\u id。在SQL中,这看起来像: SELECT whatever FROM Table_A INNER JOIN Table_B ON (Table_A.school_id = Table_B.school_id AND Table_A.type_id = Table_B.type_id) 据我所知,Django通过模型中定义的外键/主键进行连接。因此,如果要执行A.ob

假设我有
Table\u A
,我想将它加入
Table\u B
的两个字段中,
school\u id
type\u id
。在SQL中,这看起来像:

SELECT whatever
FROM Table_A
INNER JOIN Table_B 
 ON (Table_A.school_id = Table_B.school_id 
     AND Table_A.type_id = Table_B.type_id)

据我所知,Django通过模型中定义的外键/主键进行连接。因此,如果要执行
A.objects.filter(B_ufield2=“stuff”)
操作,除了将
表\u B.field2=stuff
放在
WHERE
子句中之外,它还会隐式地加入
A.B_uid=B.id
。是否有一种方法可以代替我选择的键进行连接,如上面的SQL查询?

如果用这种形式表示查询仍然有效:

SELECT whatever FROM Table_A, Table_B WHERE (Table_A.school_id = Table_B.school_id 
     AND Table_A.type_id = Table_B.type_id)
(这相当于您上面的示例…)那么可以通过Django ORM和条款实现这一点,例如:

TableA.objects.extra(
    tables=['myapp_tableb',],
    where=['myapp_tablea.school_id=myapp_tableb.school_id',
           'myapp_tablea.type_id=myapp_tableb.type_id']
)
我意识到,在SQL中可能会有一些复杂的连接,它们本身不适合这种连接


丑陋的部分是你必须使用真正的SQL表名而不是Django模型名,它有点接近原始SQL。。。但是你会得到一个普通的Django QuerySet对象

如果用此表单表示您的查询仍然有效:

SELECT whatever FROM Table_A, Table_B WHERE (Table_A.school_id = Table_B.school_id 
     AND Table_A.type_id = Table_B.type_id)
(这相当于您上面的示例…)那么可以通过Django ORM和条款实现这一点,例如:

TableA.objects.extra(
    tables=['myapp_tableb',],
    where=['myapp_tablea.school_id=myapp_tableb.school_id',
           'myapp_tablea.type_id=myapp_tableb.type_id']
)
我意识到,在SQL中可能会有一些复杂的连接,它们本身不适合这种连接


丑陋的部分是你必须使用真正的SQL表名而不是Django模型名,它有点接近原始SQL。。。但是你会得到一个普通的Django QuerySet对象

由于某种原因,
A.B_id=B.id
不正确吗?我不想这样限制它。。我想允许
Table_A
加入
Table_B
即使
Table_A
不是它的孩子,你确定这是解决任务的最佳(或唯一)方法吗?你能展示你的模型并描述你想要得到的结果吗?是不是因为某种原因,
A.B_id=B.id
不正确?我不想这样限制它。。我想允许
Table_A
加入
Table_B
即使
Table_A
不是它的孩子,你确定这是解决任务的最佳(或唯一)方法吗?你能展示你的模型并描述你想要得到的结果吗?