【问题标题】:I would like my subqueries to return more than one value (= for each member), is it possible?我希望我的子查询返回多个值(= 每个成员),这可能吗?
【发布时间】:2019-05-03 09:43:20
【问题描述】:

在我的网站上,人们可以发表文章并喜欢它们。

我想根据每个成员发表的文章数量和获得的点赞数来计算每个成员的级别。

我有一个工作正常的请求,但由于我猜是子查询,一次只针对一个成员。所以现在,我只能在他们的个人资料页面上这样做。

我想请求所有成员为我的主页做一个前 3 名。

您对我如何解决这个问题有任何想法吗?我在开发方面还很新,所以我想我的代码已经不是那么好了。感谢您的回答和建议。

// this code for one person, works fine
SELECT 
      (select (count(l.idArticle)) as nbLikes 
       from likes as l inner join articles as a on l.idArticle = a.idArticle 
       where a.pseudo ="' . $_SESSION['pseudo']. '") 
       + 
       ( select count(pseudo) as nbArticle 
       from articles and pseudo ="' . $_SESSION['pseudo']. '") 
as sumCount

// code i tried for all member but did not work, saying subqueries have more than one row

SELECT 
       (select (count(l.idArticle)/3) as nbLikes 
       from likes as l inner join articles as a on l.idArticle = a.idArticle 
       group by a.pseudo) 
       + 
       ( select count(pseudo) as nbArticle 
       from articles 
       group by pseudo) 
as sumCount

#1242 - 子查询返回多于 1 行

表结构(抱歉,每列的名称为法语): Table Article in first - and then table for like. They are quite simple I guess.

点赞表非常简单,人们只能点赞或删除点赞,不能不点赞。 表 Like 和 Article 之间的链接是使用 idArticle 建立的。 我也有会员桌,但这里没有用。

【问题讨论】:

  • 你能分享你的表结构和一些示例数据吗?也许创造一个小提琴(sqlfiddle.com
  • 改为使用 LEFT JOIN。
  • 我尝试了左连接而不是内连接,但它不起作用?也许我不明白你的建议?

标签: php mysql sql subquery


【解决方案1】:

这有点脏,但你可以这样实现。鉴于您需要一篇文章才能获得喜欢,您可以LEFT JOIN 对伪名称的点赞结果,按伪名称分组。使用IFNULL(),以防给定帖子没有赞。

SELECT a.pseudo, 
       a.ArticleCount, 
       IFNULL(likes, 0) as LikesCount, 
       IFNULL(likes, 0)/3 + ArticleCount as Score
FROM (
  SELECT IFNULL(COUNT(a.idArticle), 0) as ArticleCount, a.pseudo
  FROM articles a
  GROUP BY a.pseudo
) as a
-- Find all likes that user has gotten
LEFT JOIN (
  SELECT COUNT(l.idLike) as likes, a.pseudo
  FROM likes l
  JOIN articles a
    ON a.idArticle = l.idArticle
  GROUP BY a.pseudo
) as l
on a.pseudo=l.pseudo

【讨论】:

    【解决方案2】:

    你可以通过伪列加入 suqbeury

    select t1.pseudo,t1.nbLikes, t2.nbArticle, t1.nbLikes + t2.nbArticle,
    from ( 
      select  a.pseudo, count(l.idArticle) as nbLikes 
      from likes as l 
      inner join articles as a on l.idArticle = a.idArticle 
      group by a.pseudo
    ) t1   
    left join  (
      select pseudo, count(pseudo) as nbArticle 
      from articles 
      group by pseudo
    ) t2 ON t1.pseudo = t2.pseudo 
    

    【讨论】:

    • 如果用户在他的帖子上没有点赞,则他不会获得该文章的计数。此查询只会对至少有一个赞的帖子进行计数。据我阅读原始查询,您希望它是 +1,即使它没有喜欢?
    • 也许我需要做更多的测试,但看起来即使帖子没有喜欢它也能工作,至少我的数据是这样。将尝试几个检查。
    • sqlfiddle.com/#!9/375b6f/22(我的查询)和sqlfiddle.com/#!9/c0f69f/2(这个查询)。重建架构以在文章上添加喜欢。当一篇文章没有点赞时,它不会显示 - 因为此查询连接的是关于点赞的文章,而不是关于文章的点赞。还是我在这里遗漏了一些重要的东西......?
    • 哦,好的,我明白了!如果有人像0一样他根本不会出现。我正在验证如果一篇文章有​​ 0 个赞,文章仍然是计数的。我的错。 (对不起,我知道我的英语不是那么好,希望你能轻松阅读我)。非常感谢
    猜你喜欢
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多