【问题标题】:Complex MySQL Join with 3 tables and many2many relations复杂的 MySQL Join 与 3 个表和 many2many 关系
【发布时间】:2015-01-11 11:29:48
【问题描述】:

我有 3 个表格人员、帐户和订阅。 Account 属于 Person 是一对多,Account 和 Subscription 是多对多。我需要一个可以从三个表中选择数据的 sql。-

人员表

+----------------------------+--------------+------+-----+---------+----------------+
| Field                      | Type         | Null | Key | Default | Extra          |
+----------------------------+--------------+------+-----+---------+----------------+
| id                         | int(11)      | NO   | PRI | NULL    | auto_increment |
| username                   | varchar(128) | NO   |     | NULL    |                |
| password                   | varchar(128) | NO   |     | NULL    |                |
| account_id                 | int(11)      | NO   |     | NULL    |                |
+----------------------------+---------------+------+---------------+----------------+

账户表

+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |

+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| yearly_renew | tinyint(1)   | NO   |     | NULL    |                |
| date_joined  | date         | NO   |     | NULL    |                |
| last_renewed | datetime     | YES  |     | NULL    |                |
| signup       | tinyint(1)   | NO   |     | NULL    |                |
| reason       | varchar(100) | YES  |     | NULL    |                |
| yearly_total | int(11)      | YES  |     | NULL    |                |
| total        | int(11)      | YES  |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+

账户-订阅表

+-----------------+---------+------+-----+---------+----------------+
| Field           | Type    | Null | Key | Default | Extra          |
+-----------------+---------+------+-----+---------+----------------+
| id              | int(11) | NO   | PRI | NULL    | auto_increment |
| account_id      | int(11) | NO   | MUL | NULL    |                |
| subscription_id | int(11) | NO   | MUL | NULL    |                |
+-----------------+---------+------+-----+---------+----------------+

订阅表

+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          |
+-------------------+--------------+------+-----+---------+----------------+
| id                | int(11)      | NO   | PRI | NULL    | auto_increment |
| subscription_type | varchar(150) | YES  |     | NULL    |                |
| hold              | tinyint(1)   | NO   |     | NULL    |                |
| start_date        | date         | YES  |     | NULL    |                |
| end_date          | date         | YES  |     | NULL    |                |
| amount_paid       | double       | YES  |     | NULL    |                |
| date_paid         | date         | YES  |     | NULL    |                |
| transaction_id    | int(11)      | YES  |     | NULL    |                |
| free              | tinyint(1)   | NO   |     | NULL    |                |
+-------------------+--------------+------+-----+---------+----------------+

期望在单个查询中输出 -

输出

+-----------+------------+--------------+
| person.id | account.id | subscription.id |
+-----------+------------+--------------+
|     10    |      11 |           20 |
|     15    |      32 |           45 |
|     23    |      43 |         null |
+--------+---------+-----------------+

【问题讨论】:

  • 这些表格中没有任何内容可以将个人链接到帐户
  • 代替这些,提供有关表中数据的信息..
  • @DaleM 更新人员表。

标签: mysql sql


【解决方案1】:

试试这个。它可能会正常工作...

SELECT  p.Id AS person.id
       ,p.account_id AS account.id
       ,acsub.subscription_id as subscription.id
FROM   Person AS p
       LEFT JOIN Account-Subscription AS acsub ON p.account_id=acsub.account_id

【讨论】:

    【解决方案2】:
    SELECT  p.Id AS person.id
           ,p.account_id AS account.id
           ,acsub.subscription_id as subscription.id
    FROM   Person AS p
           INNER JOIN
           Account-Subscription AS acsub ON p.account_id=acsub.account_id
    

    【讨论】:

    • Thnx @daleM,您查询有效,但我没有清除确切的输出。人员表的计数为 36014,但您的查询返回我 - 24832。我想要属于人员的所有数据,如果订阅不可用,订阅将为空。有意义吗?
    • 更新预期输出。
    猜你喜欢
    • 1970-01-01
    • 2012-06-17
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    相关资源
    最近更新 更多