【问题标题】:joining 4 tables加入4张桌子
【发布时间】:2012-04-13 05:59:42
【问题描述】:

我不熟悉这种关系类型的数据库设计。我只是以这种方式设计了数据库。但是,我对 MySQL 的 JOIN 感到很困惑。加入所有这张表的查询应该是什么。如果你能看到表users是所有表的引用。

用户

+----------+----------------+-----------------+
| users_id | users_level_id | users_status_id |
+----------+----------------+-----------------+
|        1 |              1 |               1 |
|        2 |              2 |               1 |
+----------+----------------+-----------------+

users_credentials

+----------+---------------------------+-----------------------------+----------------------------+
| users_id | users_credential_username | users_credential_email      | users_credential_password  |
+----------+---------------------------+-----------------------------+----------------------------+
|        1 | super                     | super@gmail.com             | $5$e94e9e$vptscyHjm8rdX0j6 |
|        2 | admin                     | admin@gmail.com             | $5$fVuOmySyC0PttbiMn8in0k7 |
+----------+---------------------------+-----------------------------+----------------------------+

users_level

+----------------+-------------------------+
| users_level_id | users_level_description |
+----------------+-------------------------+
|              1 | Super Administrator     |
|              2 | Administrator           |
+----------------+-------------------------+

用户状态

+-----------------+--------------------------+
| users_status_id | users_status_description |
+-----------------+--------------------------+
|               0 | Disabled                 |
|               1 | Enabled                  |
+-----------------+--------------------------+

【问题讨论】:

标签: mysql join inner-join


【解决方案1】:

试试这个

SELECT u.*, uc.*, ul.*, us.*
FROM users u 
INNER JOIN users_credentials uc
    ON u.users_id = uc.users_id
INNER JOIN users_level ul
    ON u.users_level_id = ul.users_level_id
INNER JOIN users_status us
    ON u.users_status_id = us.users_status_id

注意使用INNER JOIN:这意味着如果用户在连接表上没有相应的记录,则不会显示;如果您需要在相关表上没有匹配记录的情况下返回每个用户,请将INNER JOIN 更改为LEFT JOIN

用户评论后编辑:
如果您只想返回某个列,请将其定义为本示例

SELECT uc.users_credential_username AS username, 
       uc.users_credential_email AS email, 
       uc.users_credential_password AS pwd, 
       ul.users_level_description AS level, 
       us.users_status_description AS status

【讨论】:

  • 谢谢马可。采用这种方法而不是 AS 是最好的方法吗?
  • @Defensor:对不起,我不明白你所说的“相当有 AS”是什么意思...
  • 我见过一些像 a.users_level_id AS level_id, 这样的查询的连接,这就是我的意思。
  • @Defensor:好吧,也许我猜:在MySQL(也不是其他数据库)中不需要使用AS,但如果你使用它并没有错......这只是可读性的问题...
  • @Defensor:如果你想重命名你的字段,你必须在SELECT部分明确地写下它们并给它们一个名字......如果你需要没关系;如果您有相同名称的字段,那么值得这样做......否则恕我直言,这是没有必要的。
【解决方案2】:

这是一个简单的查询,将连接所有这些

select *
from users
  left join users_credentials
    on users_credentials.users_id = users.users_id
  left join users_level
    on users_level.users_level_id = users.users_level_id
  left join users_status
    on users_status.users_status_id = users.users_status_id

编辑

如果你想从不同的表中获取数据 用户这个

select users.* , users_credentials.* , users_level.* , users_status.*
from users
  left join users_credentials
    on users_credentials.users_id = users.users_id
  left join users_level
    on users_level.users_level_id = users.users_level_id
  left join users_status
    on users_status.users_status_id = users.users_status_id

【讨论】:

    【解决方案3】:

    我认为这看起来像这样:

    SELECT * FROM users
    LEFT JOIN user_credentials ON users.user_id = user_credential.user_id
    LEFT JOIN user_level ON users.users_level_id = users_level.users_level_id
    

    等等..

    【讨论】:

      【解决方案4】:

      使用这种类型的查询......

      SELECT c.*, l.*, s.*
      FROM users AS u
      INNER JOIN users_credentials AS c ON (u.users_id = C.users_id)
      INNER JOIN users_level AS l ON (u.users_level_id= l.users_level_id)
      INNER JOIN users_status AS s ON (u.users_status_id= s.users_status_id)
      

      你可以在哪里指定你想要的字段。* ...

      【讨论】:

        【解决方案5】:

        Join 用于从与引用表有外键关系的规范化表中获取数据。 对于上面的带有连接的表,您可以借助参考表在两个表之间获取数据。 例如

        Select * from users a JOIN users_credentials b 
        ON a.user_id=b.user_id JOIN users_level c 
        ON c.users_level_id=a.users_level_id 
        where users_credential_username='super';
        

        此查询的结果将为您提供有关 users_credential_username=super 的用户的详细信息,例如 users_level_description。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多