php - Consulta con múltiples valores en una columna

CorePress2024-01-24  9

Tengo una tabla como:

id     name            children
1      Roberto         Michael,Dia
2      Maria           John,Alex
3      Mary            Alexandre,Diana

Mi problema es; Quiero saber quién tiene un hijo llamado Alex.

No puedo usar "where Children = 'Alex'" en SQL porque tengo más de un nombre en las mismas celdas.

Así que uso "donde a los niños les GUSTA '%Alex%'"; parece inteligente, pero al mismo tiempo empiezo todo como Alex :( Alexandre o quiero obtener dia pero el resultado es dia y diana :(

¿Cómo puedo obtener a Alex soltero en ese tipo de datos?

Espero poder explicar mi problema con mi pésimo inglés :D

2

Vernormalización. Es bastante fundamental para las bases de datos relacionales.

- Fresa

20/02/2015 a las 23:01

3

No es una buena idea tener varios elementos secundarios debajo de un campo de tabla. Sería mejor crear una segunda tabla donde se almacenen los nombres de los niños y unirla a su tabla principal usando una clave externa.

-niño

20/02/2015 a las 23:03

2

Strawberry y kidA dicen lo mismo: es necesario separar la palabra "niños" en una tabla separada y luego vincúlela nuevamente a "padres". El proceso se llama "normalización". El "enlace" entre padres e hijos se denomina "clave externa".

-paulsm4

20/02/2015 a las 23:07

2

Y también lo es FoggyDay ;-)

& ndash; Fresa

20/02/2015 a las 23:09

Posible duplicado de ¿Es realmente tan malo almacenar una lista delimitada en una columna de base de datos?

- filipsis

28/08/2018 a las 5:31



------------------------------------

La mejor solución sería normalizar su esquema. Debería tener una tabla separada con una fila para cada niño, en lugar de una lista delimitada por comas. Luego puede unirse a esta tabla para encontrar padres con un niño específico. Vea la respuesta de @themite para ver un ejemplo de esto..

Pero si no puedes hacerlo por algún motivo, puedes usar FIND_IN_SET:

WHERE FIND_IN_SET('Alex', children)

0



------------------------------------

Debes dividir los datos en dos tablas.

el primero se vería así

ID    Name
1     Roberto
2     Maria
3     Mary

Y el segundo así

ParentId     child
1            Michael
1            Dia
2            John
2            Alex

y así sucesivamente.

entonces podrás hacer la consulta que quieras sin tener que preocuparte por los me gusta y tus datos serán mucho más utilizables



------------------------------------

EsoEs por eso que querrías tener dos mesas aquí.

parents:
id  name
1   Roberto  
2   Maria
3   Mary

children:
id  parentid name
1   1        Michael
2   1        Dia
3   2        John
4   2        Alex
5   3        Alexandre
6   3        Diana

Y ahora puedes consultar esto de manera mucho más efectiva con una unión o un existe:

SELECT *
FROM Parents
WHERE EXISTS(
    SELECT * 
    FROM Children 
    WHERE parentid=Parents.id 
      AND Children.name='Alex'
 )



------------------------------------

Preferiría hacer mesas diferentes para niños y padres como esta.

Mesa para padres

parent_id     name            
1             Roberto         
2             Maria           
3             Mary     

Mesa para niños

children_id  parent_id  name
1            1          Michael     
2            1          Dia 
3            2          John

....y así sucesivamente

2

Solo me estoy burlando de tu modismo :-)

- Fresa

20/02/2015 a las 23:17

Bueno, no quería ser técnico con él porque parece que no sabe mucho (según su pregunta).

–André Ferraz

20/02/2015 a las 23:18

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare