SQL LEFT JOIN 不重复相同的行值

Posted

技术标签:

【中文标题】SQL LEFT JOIN 不重复相同的行值【英文标题】:SQL LEFT JOIN without duplicating same row values 【发布时间】:2014-10-18 16:54:34 【问题描述】:

我想知道是否有人可以帮助我解决以下问题: 我想拉一次属于该posts.text的posts.text和uids,但是当我执行下面的代码时,它会这样做:例如。有 4 个属于帖子的 uid,所以我得到了 posts.text 四次而不是一次。

$query = mysqli_query($con,
                  "SELECT posts.text, relationships.uidb
                  FROM posts
                  LEFT JOIN relationships
                  ON posts.uid=relationships.uida
                  LIMIT 10");

if(mysqli_num_rows($query) > 0)
while($row = mysqli_fetch_assoc($query))
    echo $row['text']." ".$row['uidb']."<br>";


我非常感谢任何帮助。 谢谢是提前。 彼得

更新: 期望的输出是这样的:

postsArray[0]->text = //post text
postsArray[1]->text = //another post text
postsArray[0]->uids[0] = //approved uid for first post
postsArray[0]->uids[1] = //another approved uid for first post

现在它输出: 文字 10 文本 15 文字 12

我想要这个: 文本 10、15、12

【问题讨论】:

但是有 4 个关系...你想要哪个?如果您想单独加载文本,那么这是可行的,否则这是一个关系数据库,它会返回您所要求的内容。或者,如果您不想要这个,您可以提供一些示例输入数据和所需的输出吗? 那么您是只想要每个text 1 个uidb(以及哪1 个),还是想要每个text 全部uidb 我想要所有 uidb 和一个文本 @peterpetr4 一个帖子可以有多少个 uid,帖子上的最大 uid 数量只是询问 @M Khalid Junaid 帖子可以有无限的 uid,也许我只是不知道如何正确访问输出,因为我想得到这样的输出:postsArray[0].text = post text postsArray[0].uids[1] = uid 号 postsArray[0].uids[2] = 另一个 uid 号 【参考方案1】:

一种方法是使用 Mysql 的 GROUP_CONCAT,它为每个组提供逗号分隔的值列表,即 (p.uid)

$query = mysqli_query($con,
    "SELECT p.text, GROUP_CONCAT(r.uidb SEPARATOR ', ') uidbs
     FROM posts p
     LEFT JOIN relationships r
     ON p.uid=r.uida
     GROUP BY p.uid
     LIMIT 10");

if (mysqli_num_rows($query) > 0) 
    while ($row = mysqli_fetch_assoc($query)) 
        echo $row['text'].' '.$row['uidbs'];
      /*$uidbs=  explode($row['uidbs'],',');
        foreach ($uidbs as $key => $val) 
            echo $val.' ';
        */
        echo '</br>';
    


GROUP_CONCAT

根据 docs 结果被截断为最大长度 由 group_concat_max_len 系统变量给出,它有一个 默认值为 1024。该值可以设置得更高,尽管 返回值的有效最大长度受 max_allowed_pa​​cket 的值。

【讨论】:

【参考方案2】:

也许这对你有用:

$query = mysqli_query($con,
                  "SELECT posts.text, relationships.uidb
                  FROM posts
                  LEFT JOIN relationships
                  ON posts.uid=relationships.uida
                  GROUP BY posts.uid
                  LIMIT 10");

if(mysqli_num_rows($query) > 0)
while($row = mysqli_fetch_assoc($query))
    echo $row['text']." ".$row['uidb']."<br>";


【讨论】:

【参考方案3】:
SELECT posts.text, relationships.uidb
              FROM posts
              LEFT JOIN relationships
              ON posts.uid=relationships.uida
              GROUP BY posts.primary_key_of_your_post
             LIMIT 10

【讨论】:

【参考方案4】:

您应该调用 2 个查询。在您的第一个查询中,调用文本,然后调用 uids。

您不应该编写复杂的查询,因为这会使您的业务变得更加复杂,并且您将来不会维护您的代码。

【讨论】:

以上是关于SQL LEFT JOIN 不重复相同的行值的主要内容,如果未能解决你的问题,请参考以下文章

如何根据重复的行值合并聚合函数结果 | SQL 甲骨文

加入 2 个表并将重复的行值显示到新列中

从 LEFT JOIN 中选择最大的行

将数据框中的行替换为 0,其前面的行值不同于 0

SQL left join 数据重复

SQL语句多表left join SUM出现的重复数据问题!