Pregunta sobre Developing with WordPress de Wordpress:

MySQL seleccione dónde en la lista separada por comas

Un usuario preguntó 👇

Buenas tardes, tengo una aplicación muy simple pero no parece que sea 100% correcta y agradeceríamos sus aportes.

Primero tengo una tabla con las columnas ID, entity_id, assign_users, group_name 1 | 1 | 1,2,3,4,5 | Grupo 1 2 1 | 1,2,3 | Grupo 2

Mi consulta SQL es:


$SQL_Query=("SELECT group_name FROM mytable WHERE assigned_users IN (".$user_id.")");

Si el ID de usuario está en el primer lugar de la cadena (por ejemplo, usuario 1), entonces esto funciona. Pero si user_id = 2 (o cualquier cosa después de la primera publicación), entonces no funciona.

¿Puede alguien ayudarme y ayudarme donde estoy cometiendo este tonto error?

(@bcworkz)

Hace 2 años, 10 meses

El operador IN hace coincidir el valor de una tabla con cualquiera de una lista de valores proporcionados. No funciona al revés como usted quisiera. SQL no ve los valores en assign_users como una lista de posibles enteros. Es solo una cadena de caracteres. Podría considerar usar el operador LIKE para hacer coincidir la subcadena en los valores de columna. Esto significa usar comodines para hacer coincidir el resto del cable tan pronto como el sustrato coincida. Esto le causaría problemas, ya que los números individuales no tienen plantillas únicas. Pareo LIKE '%3%' 3 estará bien, pero también 13, 33, 31, etc. Pareo LIKE '%,3,%' será compatible con el interno 3 y no con el 13, 33, etc., pero no será compatible con el terminal 3 como en ‘1,2,3’ o con el inicio 3 también. A nadie le gusta

Para hacer coincidir el principio o el final de una lista, así como las ocurrencias internas, debe usar REGEXP o RLIKE para hacer coincidir un patrón de expresión regular. No estoy seguro de cuál es el REGEXP correcto a mano. Puede utilizar uno de varios sitios de «violín» de expresiones regulares (por ejemplo regexr.com) elabora el patrón correcto.

Lo siento, esta no es una respuesta completa, pero al menos debería apuntar en la dirección correcta.

(@jakept)

Hace 2 años, 10 meses

Le resultará más fácil realizar consultas a la base de datos si puede cambiar la estructura de los datos. Por ejemplo, en lugar de tener usuarios como usuarios separados por comas en una celda, tenga otra tabla que vincule a los usuarios con los grupos.

Entonces groups a El le gustaria:

+----+-----------+---------+
| id | entity_id |  name   |
+----+-----------+---------+
|  1 |         1 | Group 1 |
|  2 |         1 | Group 2 |
+----+-----------+---------+

Luego, daría usuarios a grupos en una tabla, user_groups me gusta:

+----+---------+----------+
| id | user_id | group_id |
+----+---------+----------+
|  1 |       1 |        1 |
|  2 |       1 |        2 |
|  3 |       2 |        1 |
|  4 |       3 |        2 |
+----+---------+----------+

Entonces, si quisiera obtener los nombres de todos los grupos de usuarios, la pregunta sería:

SELECT 
	groups.name 
FROM 
	groups
LEFT JOIN
	user_groups ON
		groups.id = user_groups.group_id
WHERE
	user_groups.user_id = 1

(@diondesigns)

Hace 2 años, 10 meses

Estoy de acuerdo en que debería considerar reconstruir su tabla, pero si eso no es posible, la siguiente consulta debería darle los resultados que desea:

$sql = "SELECT group_name FROM mytable WHERE FIND_IN_SET('{$user_id}', assigned_users) <> 0";

Asegúrese de que el assigned_users la columna tiene un índice. Si hay un número predeterminado de usuarios, entonces el assigned_users la columna debe ser de tipo SET. Eso hará que el problema se ejecute mucho más rápido.

¿Solucionó tu problema??

0 / 0

Deja una respuesta 0

Tu dirección de correo electrónico no será publicada.