【问题标题】:SQL LEFT JOIN without duplicating same row valuesSQL LEFT JOIN 不重复相同的行值
【发布时间】: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 号

标签: php mysql sql join


【解决方案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>';
    }
}

根据 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。

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

        【讨论】:

          猜你喜欢
          • 2014-02-03
          • 1970-01-01
          • 2011-10-20
          • 2021-12-17
          • 2020-09-19
          • 1970-01-01
          • 1970-01-01
          • 2015-08-05
          • 2021-09-12
          相关资源
          最近更新 更多