【问题标题】:Select one row without duplicate entries选择一行没有重复条目
【发布时间】:2011-10-25 19:40:26
【问题描述】:

在mysql表info我有:

身份证、姓名、城市、日期、状态

我想从“信息”中选择所有名称 进行查询

$query = mysql_query("SELECT name FROM info WHERE status = 1 ORDER BY id") 
         or die(mysql_error());

while ($raw = mysql_fetch_array($query)) 
{
  $name = $raw["name"];
  echo ''.$name.'<br>';
}

嗯,结果是它返回了所有条目。 我想回显所有条目而不重复。

说:在原始“名称”下,我们已将名称“约翰”插入了 10 次。
我只想回声一次。 这可能吗?

【问题讨论】:

    标签: mysql sql select duplicates


    【解决方案1】:

    很简单:

    SELECT DISTINCT name FROM info WHERE status = 1 ORDER BY id
    

    SQL 关键字 DISTINCT 可以解决问题。

    【讨论】:

      【解决方案2】:

      $sql="SELECT DISTINCT name FROM status =1 GROUP BY name ORDER BY name";

      $query = mysqli_query($conn,$sql);
      <?php while ( $fire=mysqli_fetch_array($query)) { ?>
      <h4><?php echo $query['name']; ?><br></h4>
      <?php } ?>
      

      【讨论】:

        【解决方案3】:

        假设您正在发送群发短信,并且您不想向同一个人 John 发送两次相同的消息。我发现,同时使用 GROUP BY 和 ORDER BY 的技巧效果很好。但我并不是说这是最好的方法。这是你如何使用它

        SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY name
        

        编辑:请务必注意,当您需要的不仅仅是单列并且每行的值是唯一的,那么 DISTINCT 就没有帮助。

        【讨论】:

        • +1 这在我的情况下是正确的。因为我不得不接受SELECT id,name,email from SIGNUP where groups='admin' Group by email ORDER by id
        【解决方案4】:

        这对我有用,返回给定数据库的表名。

        my $sql="select distinct table_name from COLUMNS  where table_schema='$database'"
        my $sth = $dbht->prepare( $sql )
              or die "Cannot prepare SQL statement: $DBI::errstr\n";
          $sth->execute
              or die "Cannot execute SQL statement: $DBI::errstr\n";
        
          if ($DBI::err){
        
            $msg= "Data fetching terminated early by error: $DBI::errstr";
        
        }
        
        
        while (@col=$sth->fetchrow_array()){
            $table[$i]=$col[0];
            $i++;
        }       
        

        【讨论】:

          【解决方案5】:

          改变

          SELECT name FROM info WHERE status = 1 ORDER BY id
          

          SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY id
          

          观察到添加了GROUP BY。更多关于http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html分组的信息

          编辑:
          对于出现次数的名称,请尝试

          SELECT name, count(name) FROM info WHERE status = 1 GROUP BY name ORDER BY id

          【讨论】:

          • 有效,但我想在“名称”之后加上多少条目的数量是这样的code echo ''.$name。' (次)';
          【解决方案6】:

          尝试将其用作您的查询:

          SELECT DISTINCT name FROM info WHERE status = 1 ORDER BY id
          

          获取不同的名称

          或其他建议使用GROUP BY

          SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY id
          

          我认为第一个更直观,两者之间没有太大的性能差异

          编辑

          因为 OP 还想要这里的名字数量:

          SELECT name,COUNT(id) AS n_names
          FROM info WHERE status = 1
          GROUP BY name
          ORDER BY name
          

          您可以 ORDER BY namen_names 取决于您的需要

          【讨论】:

            【解决方案7】:

            使用 按名称分组 声明

            $query = mysql_query("SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY id") or      die(mysql_error());
            
            while ($raw = mysql_fetch_array($query)) {
                            $name = $raw["name"];
                            echo ''.$name.'<br>';
                            }
            

            【讨论】:

              【解决方案8】:

              GROUP BY name 添加到您的 SQL 语句中 - 这只会从名称列中返回每个条目中的一个

              【讨论】:

              • 当 GROUP By name 被应用时,它只占用第一行吗?如果按 ID 下单?
              • @YumYumYum 订单不保证,除非您添加order by 声明
              • 感谢安全,我使用了这个SELECT id,duplicate_name,duplicate_email from SERVICE where duplicate_email='a@b.com' GROUP BY duplicate_email ORDER BY id,当该用户已经注册并下次再次登录该特定项目时,它会给我一行
              猜你喜欢
              • 1970-01-01
              • 2013-03-19
              • 1970-01-01
              • 2021-05-18
              • 2015-03-04
              • 2018-02-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多