【问题标题】:SQL, How to query with multiple foreign keys in a table?SQL,如何使用表中的多个外键进行查询?
【发布时间】:2009-09-12 17:19:23
【问题描述】:

我有一个项目表,其中有两个用户外键(user_id 和winner_user_id),一个用于项目所有者,一个用于项目获胜者。类似的东西

+----------------+-------------------------+------+-----+---------+----------------+
| Field          | Type                    | Null | Key | Default | Extra          |
+----------------+-------------------------+------+-----+---------+----------------+
| project_id     | int(10) unsigned        | NO   | PRI | NULL    | auto_increment | 
| start_time     | datetime                | NO   |     | NULL    |                | 
| end_time       | datetime                | NO   |     | NULL    |                | 
| title          | varchar(60)             | NO   |     | NULL    |                | 
| description    | varchar(1000)           | NO   |     | NULL    |                | 
| user_id        | int(11)                 | NO   |     | NULL    |                | 
| winner_user_id | int(10) unsigned        | YES  |     | NULL    |                | 
| type           | enum('fixed','auction') | YES  |     | NULL    |                | 
| budget         | decimal(10,0)           | YES  |     | NULL    |                | 
+----------------+-------------------------+------+-----+---------+----------------+

现在我正在尝试在单个查询中获取有关项目的信息以及有关两个用户的数据。

所以我制定了一个类似的查询

SELECT projects.project_id, projects.title, projects.start_time,
            projects.description, projects.user_id, projects.winner_user_id,
            users.username as owner, users.username as winner
        FROM projects,users   
        WHERE projects.user_id=users.user_id
        AND projects.winner_user_id=users.user_id

显然返回一个空集。真正的问题是如何引用这些不同的 user_id。我什至尝试使用 AS 关键字,然后使用我在同一个 sql 查询中创建的名称,但显然这不起作用。

为了最后把事情说清楚,我想要类似的东西

+------------+-------------------------------------------------+---------------------+---------+----------------+--------------+--------------+
| project_id | title                                           | start_time          | user_id | winner_user_id | owner        | winner       |
+------------+-------------------------------------------------+---------------------+---------+----------------+--------------+--------------+
|          1 | CSS HTML Tableless expert for site redesign     | 2009-09-01 21:07:26 |       1 |              3 | mr X        | mr Y        | 
|          2 | High Quality Ecommerce 3-Page Design HTML & CSS | 2009-09-01 21:10:04 |       1 |              0 | mr X        | mr Z        | 

如何构造一个查询来处理这个问题?

提前致谢。

【问题讨论】:

    标签: sql mysql database


    【解决方案1】:

    您已接近,但您需要两次加入用户表,一次加入所有者,一次加入获胜者。使用表别名来区分两者。

    SELECT 
          projects.project_id
        , projects.title
        , projects.start_time
        , projects.description
        , projects.user_id
        , projects.winner_user_id
        , users.username as owner
        , winnerUser.username as winner
    FROM projects
    INNER 
        JOIN users
        ON projects.user_id=users.user_id
    INNER 
        JOIN users winnerUser
        ON projects.winner_user_id=winnerUser.user_id
    

    【讨论】:

    • 非常感谢!我从未真正使用过 INNER JOIN 语法,但有趣的是,没有在 FROM 之后直接指定获胜者用户。
    【解决方案2】:
    SELECT ... FROM users AS winers, users AS owners 
    WHERE projects.user_id=owners.user_id
            AND projects.winner_user_id=winners.user_id
    

    【讨论】:

      【解决方案3】:

      使用这样的东西怎么样:

      SELECT projects.project_id, projects.title, projects.start_time,
          projects.description, projects.user_id, projects.winner_user_id,
          user_owner.username as owner, user_winner.username as winner
      FROM projects
          inner join users user_owner on user_owner.user_id = projects.user_id
          inner join users user_winner on user_winner.user_id = projects.winner_user_id
      

      您首先拥有该项目,然后您对所有者进行内部联接(使用一个特定别名),然后对获胜者进行内部联接(使用另一个特定别名) .

      并且,在 select 子句中,您可以使用这些别名来获取您想要的信息——如果您需要限制 where 子句中的任何内容,顺便说一句。

      注意:如果您还想要还没有获胜者的项目,您可能需要使用左连接而不是内部连接。

      【讨论】:

        【解决方案4】:
        SELECT u1.user_id AS user_id, u2.user_id AS AS winner_id 
        FROM projects p
            INNER JOIN users u1 ON p.user_id=u1.user_id
            INNER JOIN users u2 ON p.winner_user_id=u2.user_id
        

        【讨论】:

          【解决方案5】:

          这应该可以工作,如果获胜者未知(当winner_user_id为空时)返回NULL

          SELECT projects.project_id, 
            projects.title, 
            projects.start_time,
            projects.description, 
            projects.user_id, 
            projects.winner_user_id,
          users_owner.username as owner, 
          users_winner.username as winner
          FROM projects
            INNER JOIN users AS users_owner ON users_owner.user_id = projects.user_id
            LEFT OUTER JOIN users AS users_winner ON users_winner.user_id = projects.winner_user_id
          

          【讨论】:

            猜你喜欢
            • 2019-03-15
            • 1970-01-01
            • 1970-01-01
            • 2016-12-26
            • 1970-01-01
            • 1970-01-01
            • 2012-09-11
            • 2017-11-25
            • 1970-01-01
            相关资源
            最近更新 更多