thinkphp3表连查带求和
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thinkphp3表连查带求和相关的知识,希望对你有一定的参考价值。
thinkphp3表连查带求和
表1 -a
订单号 客户代码
001 HY
002 SH
表2-b
编号 订单号 名称
1 001 zz
2 001 ls
3 002 ww
表3-c
编号 表2编号 金额
01 1 50
02 1 100
03 2 200
查询表2
订单号 客户代码 b编号 b名称 合计金额
001 HY 1 zz 150
FROM dc_c1 a
left join dc_c2 b ON a.id=b.c1_num
left join (select c2_num, sum(money) as price from dc_c3 group by c2_num) c on c.c2_num = b.id
What Joins 用于将多个表连接到一个视图中
【中文标题】What Joins 用于将多个表连接到一个视图中【英文标题】:What Joins to use to join multiple tables together into one view 【发布时间】:2013-03-06 12:14:45 【问题描述】:我在 mysql 中有一个带有多个表的数据库,我想将多个表连接到一个视图中,这样我就不必在 php 中构建 3 或 4 个 sql 语句甚至是一个大型连接语句来获取相同的信息。
这是我想加入的所有表格
track_title
+----+------------------+
| ID | TITLE |
+----+------------------+
| 1 | Title Here |
| 2 | Another Title |
| 3 | Some Other Title |
+----+------------------+
track_artist
+----+----------------+-----------+-----------+
| ID | TRACK_TITLE_ID | ARTIST_ID | SYMBOL_ID |
+----+----------------+-----------+-----------+
| 1 | 1 | 1 | 2 |
| 2 | 1 | 2 | 1 |
| 3 | 3 | 1 | 1 |
+----+----------------+-----------+-----------+
artist
+----+-------------+
| ID | ARTIST |
+----+-------------+
| 1 | Linkin Park |
| 2 | Metallica |
+----+-------------+
symbol
+----+--------+
| ID | SYMBOL |
+----+--------+
| 1 | |
| 2 | Feat. |
+----+--------+
tracklisting
+----+----------+----------+---------------+---------+
| ID | TRACK NO | TITLE_ID | VERSION | DISC NO |
+----+----------+----------+---------------+---------+
| 1 | 1 | 1 | | 1 |
| 2 | 1 | 2 | Album Version | 1 |
| 3 | 1 | 3 | Live Version | 1 |
+----+----------+----------+---------------+---------+
这是我正在寻找的最终视图
+----+----------+------------------+---------------+-----------------------------+---------+
| ID | TRACK NO | TITLE | VERSION | ARTIST | DISC NO |
+----+----------+------------------+---------------+-----------------------------+---------+
| 1 | 1 | Title Here | | Linkin Park Feat. Metallica | 1 |
| 2 | 1 | Another Title | Album Version | | 1 |
| 3 | 1 | Some Other Title | Live Version | Linkin Park | 1 |
+----+----------+------------------+---------------+-----------------------------+---------+
在过去的 3 天里,我一直在用左、右、加入和完全加入来抨击我的头,但似乎无法让它工作。
基本上我想要发生的是 track_artist 表将从各自的表中获取艺术家和符号,并将它们连接到一列中。然后加入 title 和 concat 列来获得这个视图。
full_artist_view
+----------+------------------+-----------------------------+
| TITLE_ID | TITLE | FULL_ARTIST |
+----------+------------------+-----------------------------+
| 1 | Title Here | Linkin Park Feat. Metallica |
| 2 | Another Title | |
| 3 | Some Other Title | Linkin Park |
+----------+------------------+-----------------------------+
我已经做到了这一点,但是当我尝试将其加入跟踪列表时,我似乎使我的服务器崩溃,这变得非常痛苦。没有mysql错误所以我猜我使用了错误的连接或者这是不可能的。(虽然我看不出这是不可能的)
tracklisting 表每周都在以 1000 条记录的速度持续增长,并且正处于 +- 75000 条记录中。
对我来说,这是应该工作的 sql,但没有
FROM full_artist_view LEFT JOIN tracklisting ON
full_artist_view.TITLE_ID = tracklisting.TITLE_ID
【问题讨论】:
你能把full_artist_view
的代码贴出来吗?
【参考方案1】:
虽然我只有你的小数据样本,但我看不到你的 full_artist_view
代码是什么样的。您应该能够使用以下方法获得结果:
select tt.id,
tl.`track no`,
tt.title,
coalesce(tl.version, '') version,
group_concat(concat(coalesce(a.artist, ''), ' ', coalesce(s.symbol, '')) order by a.artist SEPARATOR ' ') artist,
tl.`disc no`
from track_title tt
inner join tracklisting tl
on tt.id = tl.TITLE_ID
left join track_artist ta
on tt.id = ta.TRACK_TITLE_ID
left join artist a
on ta.artist_id = a.id
left join symbol s
on ta.symbol_id = s.id
group by tt.id, tl.`track no`, tt.title, tl.version, tl.`disc no`
见SQL Fiddle with Demo。这返回:
| ID | TRACK NO | TITLE | VERSION | ARTIST | DISC NO |
---------------------------------------------------------------------------------------------
| 1 | 1 | Title Here | | Linkin Park Feat. Metallica | 1 |
| 2 | 1 | Another Title | Album Version | | 1 |
| 3 | 1 | Some Other Title | Live Version | Linkin Park | 1 |
【讨论】:
这适用于像这里这样的一些记录作为示例,70000 + 记录和崩溃。我认为像这样的大型记录集的连接变得非常激烈。除非我错过了什么 @Mark 您的表上有哪些索引?解释计划说了什么? 我可能忘记在我的列上放置索引。一旦我添加了索引,它就可以完美运行。感谢大家的帮助 @Mark 我很高兴你明白了!乐意效劳。 :)【参考方案2】:快速播放,我认为(但不确定)你需要这样的东西:-
SELECT a.Id, a.Track_No, b.Title, a.Version, GROUP_CONCAT(CONCAT(d.Artists, e.Symbol)), a.Disc_No
FROM tracklisting a
INNER JOIN track_title b ON a.Title_id = b.Id
LEFT OUTER JOIN track_artist c ON b.Id = c.Track_Title_Id
LEFT OUTER JOIN artist d ON c.Artist_Id = d.Id
LEFT OUTER JOIN symbol e ON d.SymbolId = e.Id
GROUP BY a.Id, a.Track_No, b.Title, a.Version, a.Disc_No
但我可能错过了什么,所以请告诉我!
【讨论】:
以上是关于thinkphp3表连查带求和的主要内容,如果未能解决你的问题,请参考以下文章