2012-06-11 3 views
5

Я в настоящее время таблицу MySQL, как:MySQL данные столбцов, возвращаемых в виде разделенных запятыми список

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

Я пытаюсь захватить все друг идентификаторы одного конкретного пользователя и расположить их в запятую. Например, схватил друзей пользователя 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). Примеры here и here.

0

Я использовал переменную @a, хранить идентификаторы, в конце у вас есть значения в переменной или попытаться с пределом, групповой заказ, например:

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 атак.
  • В зависимости от того, что вы на самом деле делаете, есть хороший шанс, что сохранение списка строк, разделенных запятыми, не является хорошим способом сделать это.
Смежные вопросы