从具有 2 个外键的 2 个表中选择
Posted
技术标签:
【中文标题】从具有 2 个外键的 2 个表中选择【英文标题】:Select from 2 tables with 2 foreign keys 【发布时间】:2014-10-17 05:28:59 【问题描述】:我有一个问题要问你,我还没有找到解决方案,所以我有 2 个表:
dosar
id name date fk_user fk_verificator
1 dosar 1 08/08/14 1 2
users
id name is_admin is_verificator
1 admin Y N
2 verificator N Y
fk_user 是指向用户的外键,fk_verificator 也是指向用户表的外键。所以我需要创建一个 select 来为 dosar 获取 2 个用户
name date name is_admin is_verificator
dosar1 08/08/14 admin Y N
verificator N Y
我的查询:
$uid = (int) $this->uri->segment(3, 0);
$this->load->database();
$get_dosar = $this->db->query("SELECT * FROM dosar,users WHERE
users.id = dosar.fk_user AND
users.id = dosar.fk_verificator
AND dosar.id_dosar = $uid");
请帮帮我。
【问题讨论】:
从哪里开始。这里有很多基本的坏东西。 【参考方案1】:这使用现代连接语法(最好不要将连接条件放在 WHERE 子句中):
小提琴: http://sqlfiddle.com/#!9/d6e60/2/0
select d.name, d.date, u.is_admin, u.is_verificator
from dosar d
join users u
on u.id = d.fk_user
or u.id = d.fk_verificator
where d.id = $uid
输出(对于 dosar 上的 ID #1):
| NAME | DATE | IS_ADMIN | IS_VERIFICATOR |
|---------|-------------------------------|----------|----------------|
| dosar 1 | August, 08 2014 00:00:00+0000 | Y | N |
| dosar 1 | August, 08 2014 00:00:00+0000 | N | Y |
您似乎不想重复与上一行相同的 NAME 或 DATE 值。这应该在 php 中完成,而不是 SQL。
因为您总是只选择一个 ID,所以在 mysql 中执行它也有点简单(见下文),但我仍然建议在 PHP 中执行该部分。
select case when rn = 1 then name end as name,
case when rn = 1 then date end as date,
is_admin,
is_verificator
from(select d.name, d.date, u.is_admin, u.is_verificator, @rw := @rw + 1 as rn
from dosar d
join users u
on u.id = d.fk_user
or u.id = d.fk_verificator
cross join (select @rw := 0) r
where d.id = 1) x
输出:
| NAME | DATE | IS_ADMIN | IS_VERIFICATOR |
|---------|-------------------------------|----------|----------------|
| dosar 1 | August, 08 2014 00:00:00+0000 | Y | N |
| (null) | (null) | N | Y |
小提琴: http://sqlfiddle.com/#!9/d6e60/3/0
【讨论】:
【参考方案2】:您的默认 JOIN 类型在这里不起作用。
检查 MySQL: Quick breakdown of the types of joins
而且您可能需要在表之间进行外部连接。
(在您更改问题后,可能是 RIGHT JOIN)
【讨论】:
【参考方案3】:那怎么样?如果不满意,请告诉我为什么。如果它确实有效,那么我会解释原因。
"SELECT d.name,d.date,u.name,u.is_admin,u.is_verificator
FROM dosar d,users u WHERE
users.id = dosar.fk_user OR
users.id = dosar.fk_verificator
AND dosar.id_dosar = $uid"
如果您真的想要空白单元格,我建议避免将这种负担放在 SQL 上。
【讨论】:
以上是关于从具有 2 个外键的 2 个表中选择的主要内容,如果未能解决你的问题,请参考以下文章