Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Subconsulta multiple (?)

Estas en el tema de Subconsulta multiple (?) en el foro de Mysql en Foros del Web. Hola amigos : estoy tratando de hacer una sub-sub-consulta para recoger todos los significados de una palabra de un diccionario que utiliza dos tablas: + ...
  #1 (permalink)  
Antiguo 26/08/2009, 12:02
 
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 10 años, 5 meses
Puntos: 10
Exclamación Subconsulta multiple (?)

Hola amigos: estoy tratando de hacer una sub-sub-consulta para recoger todos los significados de una palabra de un diccionario que utiliza dos tablas:

+ Tabla 'words' con los campos word y word_id
+ Tabla 'word_meanings con los campos word_id y meaning_id

Cada palabra aparece varias veces en la columna menaning_id de la tabla word_meaning,.. una por cada sinonimo.

Hasta aca bien:

Cita:
SELECT word FROM words WHERE id IN (
SELECT word_id FROM word_meanings WHERE meaning_id =10)
pero se me complico al querer hacer...

Cita:
SELECT word FROM words WHERE id IN (
SELECT word_id FROM word_meanings WHERE meaning_id IN (
SELECT id FROM words WHERE word='rendirse'))
En este ultimo caso... lejos de darme todos los significados de 'rendirse'... me dio cualquier otra cosa: significados de otros varios terminos

Que hice mal? es de las primeras veces que hago sub-consultas

GRACIASSSSSSSSSSSSSssss
  #2 (permalink)  
Antiguo 26/08/2009, 18:48
 
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 10 años, 5 meses
Puntos: 10
Respuesta: Subconsulta multiple (?)

Bueno........ya solucioné......son 4 consultas anidadas

No pongo la respuesta porque terminé haciendolo en PHP al no darme cuenta en principio que me faltaba una 4ta consulta
  #3 (permalink)  
Antiguo 26/08/2009, 22:33
Avatar de conkerick  
Fecha de Ingreso: febrero-2009
Ubicación: WWW
Mensajes: 75
Antigüedad: 10 años, 11 meses
Puntos: 2
Respuesta: Subconsulta multiple (?)

Igualmente creo que sería bueno que lo compartieras, por si alguien necesita ayuda.

Saludos.
  #4 (permalink)  
Antiguo 27/08/2009, 02:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 11 años, 10 meses
Puntos: 300
Respuesta: Subconsulta multiple (?)

Para eso, creo, necesitas una sola consulta, y luego los muestras usando PHP, si es ese el programa que usas.
SELECT word_meanings.meaning_id FROM word INNER JOIN word_meanings USING (word_id) WHERE word ='rendirse' ORDER BY word_meanings.meaning_id
o algo así.
Te saldrán todos los sinónimos de 'rendirse' ordenados alfabéticamente y luego sólo tendrás que mostrarlos con PHP. Eso, si es que he entendido bien. Deberías ofrecernos más ejemplos de cómo tienes los datos y cómo quieres mostrarlos.
  #5 (permalink)  
Antiguo 27/08/2009, 06:27
 
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 10 años, 5 meses
Puntos: 10
Respuesta: Subconsulta multiple (?)

Gracias Jurena! como ya solucioné ... sigo viaje......aunque tomo nota y si alguien quisiera la respuesta ... me puede contactar por correo ;)

gracias a todos
  #6 (permalink)  
Antiguo 29/08/2009, 22:24
 
Fecha de Ingreso: agosto-2009
Mensajes: 9
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Subconsulta multiple (?)

Saludos...

Regularmente el select where in (...) consume mas tiempo que los joins, recomendaria hacer un inner join... respecto a tu query:

SELECT word FROM words WHERE id IN (
SELECT word_id FROM word_meanings WHERE meaning_id IN (
SELECT id FROM words WHERE word='rendirse'))

En el ultimo subquery seleccionas id from words y los comparas con meaning_id.... entonces? tendiras que recuperar los ids de los significados, no?

El punto es en este caso usar joins en lugar de where id in...
Espero haber podido aportar
Saludos
  #7 (permalink)  
Antiguo 29/08/2009, 23:12
 
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 10 años, 5 meses
Puntos: 10
Respuesta: Subconsulta multiple (?)

yonarox: hola! la verdad... me mareo con INNER JOIN.. pero aca los 4 SELECTs...

Código php:
Ver original
  1. $word='rendirse';
  2.    
  3.       $rs1=$con->execute("SELECT id  FROM words WHERE word='$word'");
  4.       $id=$rs1->fields['id'];            
  5.      
  6.       if (isset($id)){   
  7.         $rs1=$con->execute("SELECT meaning_id  FROM word_meanings WHERE word_id='$id'");
  8.         $mid=$rs1->fields['meaning_id'];                 
  9.      
  10.         if (isset($mid)){
  11.           $rs2=$con->execute("SELECT word FROM words WHERE id IN (SELECT word_id FROM word_meanings WHERE meaning_id =$mid)");
  12.          
  13.          
  14.           foreach ($rs2 as $row){
  15.             $word2=$row['word'];               
  16.             echo "$word -> $word2<br/>";
  17.           }
  18.         }
  19.  
  20.      }

Se podria expresar como SELECT anidados pero lo termine haciendo asi.....

Dicen que puedo hacer esto con INNER JOIN ?? no es acaso para "unir" resultados de consultas? [email protected]
  #8 (permalink)  
Antiguo 30/08/2009, 04:19
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 11 años, 10 meses
Puntos: 300
Respuesta: Subconsulta multiple (?)

Sí es unirlos y de eso se trata en el caso de las bases de datos, y de esa manera aprovechas de paso el uso de los índices. Las bases relacionales funcionan así y debe aprovechar el motor. Lo que estás haciendo es como si tuvieras los datos en varios archivos de texto. Se resiente la eficiencia.
Y ya veo tu problema inicial, que tienes que instanciar dos veces a la misma tabla, la de palabras, que es donde tienes todas las palabras. Deberías decirnos la estructura de ambas tablas con algún ejemplo de los datos.
SELECT w2.word FROM words INNER JOIN word_meanings USING (word_id) INNER JOIN words w2 USING (word_id) WHERE words.word ='rendirse' ORDER BY word_meanings.meaning_id

Es cierto que, en muchas ocasiones, resulta más eficiente usar php o el programa que uses, en lugar de emplear una consulta poco eficiente, y, la verdad, no sé si este será el caso, pero en cualquier caso, debes aprender a usar INNER JOIN, etc. Eso es necesario, muy necesario.
  #9 (permalink)  
Antiguo 30/08/2009, 07:35
 
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 10 años, 5 meses
Puntos: 10
Respuesta: Subconsulta multiple (?)

Hola Jurena! te cuento... porque pegar datos es complicado... porque estan muy "dispersos"

Se podria haber hecho una tabla de palabras-significados (array serializado) lo cual no seria "relacional" pero si bastante rapido..... pero como son sinonimos,...

Otra opcion hubiera sido:

Cita:
palabra1 .... sinonimo1
palabra1 .... sinonimo2
palabra1 ... sinonimon
palabra2 ... sinonimo1
....
Y para ahorrar espacio la forma que se usó fue:

Cita:
palabra... id_palabra (words)
palabra_id ... meaning_id (word_meanings)
Asi... ambas tablas usan indices numericos y en particular, la tabla de word_meanings solo tiene numeros.

El diseño no es mio...y para mi tiene algunas desventajas... como por ejemplo... que se asume que A es sinonimo de B, C, D => C es sinonimo de A (por ejemplo) y no siempre es cierto en ambos sentidos y en todos los casos (acepciones)
  #10 (permalink)  
Antiguo 30/08/2009, 10:25
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 11 años, 10 meses
Puntos: 300
Respuesta: Subconsulta multiple (?)

Te entiendo, bigwhite,
aunque creo que la estructura que has heredado no es mala.
No voy a decirte que cambies nada de lo que tienes hecho con PHP y que parece funcionarte bien, pero quiero que veas que la base de datos te permite hacer lo mismo. Esto te buscará los sinónimos de 'rendirse'

Código sql:
Ver original
  1. SELECT palabra FROM words INNER JOIN
  2.  (SELECT w.idpalabra palabra1, w2.idpalabra palabra2 FROM word_meanings wm
  3. INNER JOIN (words w, words w2) ON (w.idpalabra = wm.palabra_id AND w2.idpalabra = wm.meaning_id)
  4.  WHERE (w.palabra = 'rendirse' OR w2.palabra = 'rendirse'))t1
  5.  ON words.idpalabra = t1.palabra1 OR words.idpalabra = t1.palabra2
  6.  WHERE words.palabra <> 'rendirse'

Seguro que hay alguna otra consulta para hacer esto.
No sé que será más eficiente si esto o lo que ya tienes, aunque creo que lo tuyo pudiera ser mejor en este caso.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:17.