2012-06-11 29 views
5

Actualmente tengo una tabla de MySQL como:datos de la columna MySQL devuelve como delimitado por comas lista

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

Estoy tratando de agarrar todas las de amigo ID de un usuario concreto y las une en una lista separada por comas. Por ejemplo, agarró los amigos de usuario1, se volvería como

$friend_list = 2,5,10 

Actualmente, tengo:

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

Esto sólo agarra una fila though..please ayudar!

Gracias

+0

Estoy muy en contra de 'GROUP_CONCAT' - para mí se siente como un mal uso de un motor de base de datos. – jnylen

+1

@jnylen - No estoy seguro de por qué, tampoco hay notas de advertencia por parte de los amigos de MySQL, la pregunta fue etiquetada MySQL, no PHP. -Para cada uno su propio amigo, simplemente diciendo :) – GDP

+0

@GregP Supongo que es porque las operaciones de la base de datos deberían manipular y devolver tablas de datos, no deberían tratar con tipos de datos "falsos" como una cadena separada por comas, por lo que es una mala "código olor" para mí. Cada vez que tenga una lista delimitada por comas, probablemente debería dejarla en filas o en una matriz. Aquí hay un buen ejemplo de los problemas que puede enfrentar: http: // stackoverflow.com/questions/6643656/mysql-comma-delimited-list-possible-to-add-and-remove-values? rq = 1 – jnylen

Respuesta

12

que desea utilizar GROUP_CONCAT:

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

Ajustado a la corrección por la mejor respuesta.

+1

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

+1

Y, por supuesto, puede especificar el delimitador en GROUP_CONCAT :) –

+0

@WojtekT ofrece un mucho mejor respuesta ... – GDP

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

Probablemente estés buscando GROUP_CONCAT(column) función. Ejemplos here y here.

0

que utiliza una variable llamada @a, para almacenar los identificadores, en el extremo que tiene los valores de la variable o intenta con un límite, para agrupar por, como esto:

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) 

En su caso de cambiar la "condición WHERE"

o también puede hacer después del selecto:

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

Su consulta devolverá más de una fila - que suena como que sólo está leyendo el primera fila. ¿Quieres algo como esto en su lugar:

$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); 

enviar el código PHP que está utilizando para ejecutar la consulta y que será capaz de ayudar más.

Un par de notas:

  • que añade la función mysql_real_escape_string. La desinfección de las entradas de usuario de esta manera es crucial para evitar los ataques SQL injection.
  • Dependiendo de lo que realmente esté haciendo, hay una buena posibilidad de que almacenar una lista de cadenas separadas por comas no sea una buena manera de hacerlo.
Cuestiones relacionadas