【问题标题】:How I can combine 3 querys in one, with join and count in every table one row?如何将 3 个查询合二为一,在每个表中加入并计数一行?
【发布时间】:2021-05-14 14:47:35
【问题描述】:

我的桌子..

users
---------------------
pass | name | genre
---------------------
 1   | Mike | pop
 2   | Clark| rock


favorites
---------------------
id | pass | songs
---------------------
 1 | 1    | blabla
 2 | 1    | blaablaa
 3 | 1    | blblbl
 4 | 2    | lalala


suggestions
---------------------
id | pass | songs
---------------------
 1 | 1    | brrbrrr
 2 | 2    | lulala

我的查询..

1.对于用户名和类型

SELECT `name`, `genre` FROM `users` WHERE `name` = "Mike"
$user_data = mysqli_fetch_object($query);
$user_data->name;
$user_data->genre;

2.数数“Mike”中最喜欢的歌曲

SELECT COUNT(`songs`) AS "total_favorites" FROM `favorites` INNER JOIN `users` USING (pass) WHERE `name` = "Mike"
$fav_dat = mysqli_fetch_object($query);
$fav_dat->total_favorites;

3.数数来自“Mike”的建议歌曲

SELECT COUNT(`songs`) AS "total_suggestions" FROM `suggestions` INNER JOIN `users` USING (pass) WHERE `name` = "Mike"
$sug_dat = mysqli_fetch_object($query);
$sug_dat->total_suggestions;

如何将这 3 个查询合二为一?有没有更好的写法?

【问题讨论】:

  • 请将所需结果添加到您的问题 (Edit)。
  • 不确定,我的英语不太好,我用谷歌翻译了所有的东西,对不起,如果我做错了
  • "combine" 没有特别的含义。 minimal reproducible example 提供我们可以剪切、粘贴和运行的代码(包括初始化)。使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。 How to Askhelp center

标签: mysql join


【解决方案1】:

您可以对子查询使用连接

SELECT users.name, `genre`, t1.total_favorites, t2.total_suggestions
FROM `users` 
INNER JOIN  (
    SELECT name,  COUNT(`songs`) AS total_favorites 
    FROM `favorites` 
    INNER JOIN `users` USING (pass) 
    GROUP BY name
    
) t1 ON t1.name  = users.name
INNER JOIN  (
    SELECT name,  COUNT(`songs`) AS total_suggestions 
    FROM `suggestions` 
    INNER JOIN `users` USING (pass) 
    GROUP BY name
) t2 t2.name  = users.name
WHERE users.name = "Mike"

对于不匹配的值,您可以尝试 uning left join 和 ifnull

SELECT users.name, `genre`, ifnull(t1.total_favorites,0) total_favorites, ifnull(t2.total_suggestions,0) total_suggestions
FROM `users` 
LEFT  JOIN  (
    SELECT name,  COUNT(`songs`) AS total_favorites 
    FROM `favorites` 
    INNER JOIN `users` USING (pass) 
    GROUP BY name
    
) t1 ON t1.name  = users.name
LEFT  JOIN  (
    SELECT name,  COUNT(`songs`) AS total_suggestions 
    FROM `suggestions` 
    INNER JOIN `users` USING (pass) 
    GROUP BY name
) t2 t2.name  = users.name
WHERE users.name = "Mike"

【讨论】:

  • 不工作,我不知道为什么..err:字段列表中的列“名称”不明确.. t2、t1 是什么?以上 t1 ist 用户,t2 最喜欢 t3 你的代码中的建议 nit?
  • @BeKu .. 好吧,如果我的回答是正确的,请(过去 15 分钟)将其标记为已接受...看看这里如何meta.stackexchange.com/questions/5234/…
  • 但是我有一个问题,当一个表是空的,例如。建议或收藏夹,然后注意:尝试在...中获取非对象的属性“名称”注意:尝试在...中获取非对象的属性“流派”注意:尝试在非中获取属性“total_favorites” -object in ... 当表为空时输出为 0 并显示 0 会更好
  • 这不是由我的查询生成的 .. 如果您与其他表没有关系,则查询不会返回值,因为内部联接仅适用于匹配结果 .. 如果您正在使用其他表与名称相关的查询..那么您应该只使用我的查询选择的名称..
  • @scaisEdge ...如果用户没有建议或没有添加收藏夹,我可以在这个查询中做什么,在这种情况下表格是空的,我如何将 0 作为输出?例如。 Mike 已登录并在他们的个人资料显示收藏夹中:0 条建议:0 现在它只显示一个通知:-/ 感谢您的耐心和帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
相关资源
最近更新 更多