【问题标题】:many to many table join mysql多对多表连接mysql
【发布时间】:2015-10-24 19:31:05
【问题描述】:

我有三个表:

邮件

+-----+----------+----------------+
| id  | chain_id | subject        |
+-----+----------+----------------+
| 108 |      108 | aaa            |
| 109 |      109 | Chain          |
| 110 |      110 | New            |
| 111 |      108 | aaa            |
| 112 |      108 | Re: Re:  aaa   |
| 113 |      109 | Chain          |
| 114 |      114 | Fwd: Subject   |
| 115 |      108 | Fwd: aaa       |
| 116 |      108 | Re: aaa        |
| 117 |      108 | Fwd: aaa       |
+-----+----------+----------------+

链标签

+----+----------+--------+
| id | chain_id | tag_id |
+----+----------+--------+
|  1 |      108 |     15 |
|  2 |      108 |     16 |
+----+----------+--------+

mail_tags

+----+--------+---------+
| id | name   | color   |
+----+--------+---------+
| 15 | First  | #ffdaef |
| 16 | Second | #aed9ff |
+----+--------+---------+

我想从mails表中选择所有记录,mail_tags.colormail_tags.name,以及具有相同chain_id的记录数量,按mails.chain_id分组,但分组后我想离开最新记录(具有最大 id)。

我设法编写了这个查询

SELECT
        *,
        COUNT(*) AS quantity
    FROM
        (SELECT
            *
        FROM
            mails
        ORDER BY id DESC) AS t
    GROUP BY chain_id
    ORDER BY id DESC

它返回按chain_id 分组的最后一行以及该链中的邮件总数,但我不知道如何为每条记录连接标签名称和标签颜色。有些记录可能很少有标签,有些则没有。

【问题讨论】:

  • 请根据您的样本发布想要的结果。
  • 我正在使用 laravel,我想得到一个对象数组,所以每个对象都有一个嵌套的标签数组。

标签: php mysql laravel


【解决方案1】:

我不太确定我是否理解了确切的要求,但是这些方面的东西应该可以工作:

select x.id, x.chain_id, x.subject, count, mt.name, mt.color from
(
select m.*,count(*) count,max(mt.id) maxid
   from mails m
left outer join chain_tags ct on (m.chain_id=ct.chain_id)
left outer join mail_tags mt on (ct.tag_id=mt.id)
  group by m.chain_id
) x
left join mail_tags mt on x.maxid=mt.id

基本上这个想法是通过chain_id获取计数和最大mail_tag id,这是在内部查询中完成的,一旦我们知道最大邮件标签id,我们就可以连接回mail_tags并获取名称和颜色,即由主查询中的左连接完成。 希望这会有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-27
    • 2021-12-25
    • 2020-04-23
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多