php获取外键,关于php:从2个带有2个外键的表中选择

我有一个问题要问,但尚未找到解决方案,因此我有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也是指向users表的外键,所以我需要创建一个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");

帮帮我,伙计们。

从哪儿开始。 这里有很多基本的,坏的东西。

这使用了现代的连接语法(不将连接条件放在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

您的默认JOIN类型在这里不起作用。

校验

MySQL:联接类型的快速细分

可能您需要在表之间进行外部联接。

(在您更改问题后,可能是正确的加入)

那个怎么样?请让我知道它是否不满意以及原因。如果可以,那么我将解释原因。

"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上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值