2012-06-11 78 views
5

我現在有一個MySQL表所示:MySQL的列數據返回逗號分隔的列表

id | friend 
1 | 2 
1 | 5 
1 | 10 
3 | 6 
15 | 19 
21 | 4 

我試圖抓住一個特定用戶的所有好友的ID,並將其安排到一個逗號分隔的列表。例如,抓起USER1的朋友,它會返回作爲

$friend_list = 2,5,10 

目前,我有:

$sql = "SELECT friend FROM table__friends WHERE id = ".$user_id; 

這隻能抓住一排though..please幫助!

感謝

+0

我很強烈地反對'GROUP_CONCAT' - 這感覺就像是對我濫用數據庫引擎。 – jnylen

+1

@jnylen - 不知道爲什麼,MySQL的人沒有注意到這個問題,這個問題被標記爲MySQL,而不是PHP。對每個他自己的朋友,只是說:) – GDP

+0

@GregP我想這是因爲數據庫操作應該操縱並返回數據表 - 他們不應該處理「假」數據類型,如逗號分隔的字符串,所以這是一個糟糕的「代碼味道」給我。任何時候你有一個逗號分隔列表,你應該把它留在行或數組中。下面是您可以面對的問題的一個很好的例子:http:// stackoverflow。com/questions/6643656/mysql-comma-delimited-list-possible-to-add-and-remove-values?rq = 1 – jnylen

回答

12

您要使用GROUP_CONCAT:

$sql = "SELECT GROUP_CONCAT(friend) FROM table__friends GROUP BY id HAVING id = ".$user_id; 

調整爲每更好的答案的正確性。

+1

值得一提:http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_group_concat_max_len – goat

+1

你當然可以在GROUP_CONCAT中指定分隔符:) –

+0

@WojtekT提供了一個更好的回答... – GDP

3
$sql = "SELECT GROUP_CONCAT (DISTINCT friend SEPARATOR ',') 
     FROM table_friends GROUP BY id 
     HAVING id =".$user_id; 
0

您可能在尋找GROUP_CONCAT(column)的功能。示例herehere

0

我使用了一種叫做@a變量,存儲的ID,在最後您有值的變量或嘗試用 的限制,爲了組,像這樣:

mysql> show create table actor\G 
*************************** 1. row *************************** 
     Table: actor 
Create Table: CREATE TABLE `actor` (
    `actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, 
    `first_name` varchar(45) NOT NULL, 
    `last_name` varchar(45) NOT NULL, 
    `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`actor_id`), 
    KEY `idx_actor_last_name` (`last_name`) 
) ENGINE=InnoDB AUTO_INCREMENT=207 DEFAULT CHARSET=utf8 
1 row in set (0.00 sec) 


mysql> set @a:=0; 
Query OK, 0 rows affected (0.00 sec) 

mysql> select @a:=concat(@a,",",actor_id) as actor_id from actor where actor_id>195 order by (actor_id) desc limit 1; 
+----------------------------+ 
| actor_id     | 
+----------------------------+ 
| 0,196,197,198,199,200,205, | 
+----------------------------+ 
1 row in set (0.00 sec) 

在你情況改變「WHERE條件」

,或者您也可以在以後選擇:

mysql> select @a; 
+-------------------------------+ 
| @a       | 
+-------------------------------+ 
| 0,196,197,198,199,200,205,206 | 
+-------------------------------+ 
1 row in set (0.00 sec) 
0

您的查詢將返回多行 - 這聽起來像你只閱讀第一排。您需要這樣的代碼:

$sql = "SELECT friend FROM table__friends WHERE id = " 
    . mysql_real_escape_string($user_id); 

$result = mysql_query($sql); 
if (!$result) { 
    die("Something bad happened"); 
} 

$friend_arr = array(); 
while ($row = mysql_fetch_array($result)) { 
    $friend_arr[] = $row[0]; 
} 

$friend_list = implode(',', $friend_arr); 

發佈您用來運行查詢的PHP代碼,我們將能夠提供更多幫助。

有兩點要注意:

  • 我增加了mysql_real_escape_string功能。以這種方式消毒您的用戶輸入是至關重要以避免SQL injection攻擊。
  • 根據你實際在做什麼 - 存儲逗號分隔的字符串列表不是一個好辦法。