【问题标题】:Select from 2 tables with 2 foreign keys从具有 2 个外键的 2 个表中选择
【发布时间】: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");

请帮帮我。

【问题讨论】:

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

标签: php mysql sql codeigniter codeigniter-2


【解决方案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 上。

      【讨论】:

        猜你喜欢
        • 2017-09-12
        • 1970-01-01
        • 2016-09-19
        • 1970-01-01
        • 2013-06-23
        • 1970-01-01
        • 2021-06-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多