首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接3个表mysql

连接3个表mysql
EN

Stack Overflow用户
提问于 2013-03-07 07:17:35
回答 2查看 42关注 0票数 0

客户

代码语言:javascript
复制
╔═══════╦══════════╗
║ CUSID ║ CUS NAME ║
╠═══════╬══════════╣
║     1 ║ AA       ║
║     2 ║ BB       ║
║     3 ║ CC       ║
╚═══════╩══════════╝

CusSeaFood

代码语言:javascript
复制
╔════╦═══════╦══════════╗
║ ID ║ CUSID ║   NAME   ║
╠════╬═══════╬══════════╣
║  1 ║     1 ║ SeaFoodA ║
║  2 ║     1 ║ SeaFoodB ║
║  3 ║     2 ║ SeaFoodC ║
╚════╩═══════╩══════════╝

CusPizza

代码语言:javascript
复制
╔════╦═══════╦══════╗
║ ID ║ CUSID ║ NAME ║
╠════╬═══════╬══════╣
║  1 ║     1 ║ PAA  ║
║  2 ║     2 ║ PBB  ║
╚════╩═══════╩══════╝

CusSnack

代码语言:javascript
复制
╔════╦═══════╦══════╗
║ ID ║ CUSID ║ NAME ║
╠════╬═══════╬══════╣
║  1 ║     2 ║ SAA  ║
║  2 ║     3 ║ SBB  ║
╚════╩═══════╩══════╝

想要数多少海鲜,比萨饼或零食是订购的客户的例子如下。

代码语言:javascript
复制
Cus ID, Cus Name, Number Of SeaFood, Sea Food info, Number Of Pizza, Pizza info, Number of Snack, Snack info.

顾客可能不会订购所有三种类型的食物。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-07 07:20:47

您需要通过子查询单独计算每个计数,以便获得正确的结果。这将阻止您计算重复记录。

代码语言:javascript
复制
SELECT  a.*,
        COALESCE(b.totalSeaFood, 0) totalSeaFood,
        COALESCE(c.totalPizza, 0) totalPizza,
        COALESCE(d.totalSnack, 0) totalSnack
FROM    Customer a
        LEFT JOIN
        (
            SELECT  cusID, COUNT(*) totalSeaFood
            FROM    CusSeaFood
            GROUP   BY cusID
        ) b ON a.cusID = b.CusID
        LEFT JOIN
        (
            SELECT  cusID, COUNT(*) totalPizza
            FROM    CusPizza
            GROUP   BY cusID
        ) c ON a.cusID = c.CusID
        LEFT JOIN
        (
            SELECT  cusID, COUNT(*) totalSnack
            FROM    CusSnack
            GROUP   BY cusID
        ) d ON a.cusID = d.CusID
  • SQLFiddle演示

若要获得更多关于联接的知识,请访问以下链接:

  • SQL连接的可视化表示

结果

代码语言:javascript
复制
╔═══════╦══════════╦══════════════╦════════════╦════════════╗
║ CUSID ║ CUS NAME ║ TOTALSEAFOOD ║ TOTALPIZZA ║ TOTALSNACK ║
╠═══════╬══════════╬══════════════╬════════════╬════════════╣
║     1 ║ AA       ║            2 ║          1 ║          0 ║
║     2 ║ BB       ║            1 ║          1 ║          1 ║
║     3 ║ CC       ║            0 ║          0 ║          1 ║
╚═══════╩══════════╩══════════════╩════════════╩════════════╝
票数 4
EN

Stack Overflow用户

发布于 2013-03-07 07:21:54

在你的例子中,“海食信息”、“比萨信息”等等对我来说是没有意义的。如果顾客点了一份以上的海鲜或比萨饼,这里应该怎么表示呢?

通常,你会期望看到多行,每个订购的东西一行。为了获得这个信息,你甚至不需要一个连接,只需要一个UNION

代码语言:javascript
复制
SELECT * FROM CusSeaFood WHERE CusID = ?
UNION SELECT * FROM CusPizza WHERE CusID = ?
UNION SELECT * FROM CusSnack WHERE CusID = ?
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15265251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档