【问题标题】:Mysql, select id's grouped by distinct column (select all ids for each unique domain)Mysql,选择按不同列分组的ID(为每个唯一域选择所有ID)
【发布时间】:2012-12-28 01:43:49
【问题描述】:

所以我有一个 MySQL 表:

Table Data:

id | domain     | title                | Full Url to Page | ... etc ...
1  | place.com  | Place Something      | http://place.com/1...
2  | place.com  | Place Something Else | http://place.com/2...
3  | place.com  | Some Other Place     | http://place.com/3...
4  | pets.com   | Cats Dogs Oh My      | http://pets.com/2....
5  | pets.com   | Bird Edition         | http://pets.com/3....

我需要(在 PHP/JQuery 中)为每个唯一域获取一个 id 数组。所以我想要上表的最终输出是:

$finalArray = array('place.com' => array(1, 2, 3), 'pets.com' => array(4, 5));

我目前的解决方案是获取按域排序的所有行,这是 MySQL 语句:

SELECT `id`, `domain` FROM `gsort_linkdata` ORDER BY `domain`

返回:

1  | place.com
2  | place.com
3  | place.com
4  | pets.com
5  | pets.com

然后我循环遍历 PHP 中的行并将它们分解为数组。我宁愿从数据库中提取已经分解的数据。那可能吗?谢谢!

【问题讨论】:

  • 我觉得您所拥有的可能是最好的,因为您将 1) 只访问数据库一次,并且 2) 由于排序的原因,能够简单地一次性创建数组。
  • 我同意。我之前已经多次处理过这种相同类型的问题——使用多层嵌套数组。您不能从 SQL 数据库返回嵌套数组。您在 PHP 中间件中循环和构建响应的解决方案是最好的解决方案。
  • 谢谢大家。我只是不确定我是否知道最好的解决方案。我总觉得一定有更好、更快、更强的东西,所以很高兴知道我选对了。

标签: php mysql select


【解决方案1】:

你可以使用GROUP_CONCAT:

SELECT GROUP_CONCAT(`id`), `domain` FROM `gsort_linkdata` GROUP BY `domain`

(注意group_concat_max_len。)

但是因为没有办法将数组从 MySQL 传递给 PHP,你需要在 PHP 或 JS 中拆分结果字符串,所以我认为你当前的方法是更好的方法。你的方法是安全的,实际上只是 PHP 中的一个单行,其他任何东西(包括 GROUP_CONCAT)都更复杂。

【讨论】:

  • 我从未使用过 group_concat 我将不得不使用它谢谢。
  • 正如你所说,我认为这不好。您要求数据库努力创建一个逗号分隔的字符串,只是再次拆分它并且必须将字符串解析回整数。
  • @lc。我完全同意。 GROUP_CONCAT 是最接近 OP 要求的东西,因为您不能将数组从 MySQL 传递给 PHP。
猜你喜欢
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 2018-03-23
  • 2015-01-15
相关资源
最近更新 更多