【问题标题】:Select distinct values of distinct group选择不同组的不同值
【发布时间】:2013-09-11 04:12:49
【问题描述】:

我有一个类似这样的表:

    id  title  year
    ---------------
    1    abc   1999
    2    abc   2000
    3    abc   2000
    4    abc   1998
    5    bce   1999
    6    bce   1999
    7    def   1999
    8    def   1999
    9    def   2000

我正在尝试获取类似于

的数组
array('abc' => 'array(1999,2000,1998)', 'bce' => 'array(1999)', 'def' => 'array(1999, 2000)');

我知道很长的路,我认为它很耗时:

PHP:
$rid = mysql_query("SELECT DISTINCT title from table_name ORDER BY ASC);
while($arr = mysql_fetch_array($qr)){
   $title = $arr
   $rid = mysql_query("SELECT DISTINCT title from table_name ORDER BY ASC);
   $yearArr = array();
   while($arr2 = mysql_fetch_array($qr)){
      $yearArr[] = $arr2['year'];
   }
   $finalArr = array(title => $yearArr);
}

最后我得到了我正在寻找的数组,但是从上面的代码中,如果我有 1000 个不同的标题,那么整个过程将执行 1001 个查询。有什么捷径可以做到吗?

我也找到了一个类似的,但是我不能更进一步:

SELECT DISTINCT year,title FROM table_name WHERE title IN (SELECT DISTINCT title FROM papers_scanned_01) ORDER BY title ASC, year DESC

使用上面的查询我得到一个如下的数组

array( [0] => 'abc', [1] => '1999', [2] => '2000', [3] => '1998', [4] => 'bce' and so on..

【问题讨论】:

    标签: php mysql performance multidimensional-array distinct


    【解决方案1】:

    group_concat() 函数中使用DISTINCT 关键字来获取不同的值。

    像这样修改您的查询 -

    SELECT title, group_concat(DISTINCT year) as years
    FROM tb1
    group by title
    

    小提琴 - http://www.sqlfiddle.com/#!2/0812a/4

    输出 -

    TITLE   YEARS
    abc     1999,2000,1998
    bce     1999
    def     1999,2000
    

    【讨论】:

      【解决方案2】:

      你可以使用下面的代码来得到你想要的数组,只需要执行 1 个 SQL

      $sql = "SELECT title, group_concat(year) as years FROM table_name group by title"
      $rs = mysql_query($sql);
      $arr = array();
      while($row = mysql_fetch_assoc($rs)) {
         $arr[$row['title']] = explode(',',$row['years']);
      }
      

      【讨论】:

      • 哇,太棒了。我想我在谷歌上搜索的关键字错误。非常感谢..
      • 旁注 结果被截断为group_concat_max_len系统变量给定的最大长度,其默认值为1024。该值可以设置得更高,尽管返回的有效最大长度值受 max_allowed_pa​​cket 值的约束。在运行时更改 group_concat_max_len 的值的语法如下,其中 val 是一个无符号整数:dev.mysql.com/doc/refman/5.0/en/… 所以你可能会丢失数据
      猜你喜欢
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      • 2011-12-20
      • 2015-08-17
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多