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