2009-01-03 10 views
73

Bien, este es mi dilema Tengo una base de datos configurada con aproximadamente 5 tablas, todas con la misma estructura de datos. Los datos se separan de esta manera con fines de localización y para dividir un total de aproximadamente 4,5 millones de registros.MySQL - Selección de datos de varias tablas, todas con la misma estructura pero datos diferentes

La mayoría de las veces solo se necesita una tabla y todo está bien. Sin embargo, a veces se necesitan datos de 2 o más de las tablas y debe ser ordenada por una columna definida por el usuario. Aquí es donde estoy teniendo problemas.

columnas de datos:

id, band_name, song_name, album_name, genre 

MySQL Statment:

SELECT * from us_music, de_music where `genre` = 'punk' 

MySQL escupe este error:

#1052 - Column 'genre' in where clause is ambiguous 

Obviamente, estoy haciendo esto mal. ¿Alguien quiere arrojar algo de luz sobre esto para mí?

Respuesta

167

pienso que usted está buscando la cláusula UNION, a la

(SELECT * from us_music where `genre` = 'punk') 
UNION 
(SELECT * from de_music where `genre` = 'punk') 
+0

gracias, funciona exactamente de la forma en que necesito :) – Jayrox

+0

gran idea !. Un voto – Sagotharan

+0

@ mihai-limban: siento molestarte, pero ¿hay alguna forma de reconocer del conjunto de resultados que "qué resultado vino de qué mesa". Por supuesto, si necesitamos actualizar/eliminar un registro de este conjunto de resultados, no hay forma de saberlo. –

18

Suena como que estaría happer con una sola tabla. Los cinco que tienen el mismo esquema, y ​​que a veces necesitan ser presentados como si vinieran de una mesa, apuntan a ponerlo todo en una tabla.

Agregue una nueva columna que se pueda usar para distinguir entre los cinco idiomas (supongo que su idioma es diferente entre las tablas ya que dijo que era para la localización). No te preocupes por tener 4,5 millones de registros. Cualquier base de datos real puede manejar ese tamaño sin problema. Agregue los índices correctos y no tendrá problemas para tratarlos como una sola tabla.

+0

originalmente tenía todos mis datos en una sola tabla, pero comenzó a gatear durante 5-10 segundos después de alrededor de 3,5 millones de registros. Encontré que dividirlo funcionaba mejor para mí porque era mucho más rápido. Ahora tengo un nuevo servidor web, por lo que puede ser mejor, pero parece demasiado complicado combinarlo. – Jayrox

+23

Parece que necesita agregar índices a las tablas. –

+2

Una vez más, me gustaría poder recomendar comentarios ... – staticsan

4

Cualquiera de las respuestas anteriores son válidas, o una forma alternativa es ampliar el nombre de tabla para incluir el nombre de la base de datos, así - por ejemplo:

SELECT * from us_music, de_music where `us_music.genre` = 'punk' AND `de_music.genre` = 'punk' 
+0

que le da un conjunto de resultados muy mal definido: todos los pares posibles de us_ y de_ punk. –

3

La columna es ambigua porque aparece en ambas tablas se necesitaría especificar el campo donde (u ordenar) completamente, como us_music.genre o de_music.genre, pero normalmente especificarías dos tablas si luego las unirías de alguna manera. La estructura con la que se trata se denomina ocasionalmente tabla dividida, aunque generalmente se utiliza para separar el conjunto de datos en archivos distintos, en lugar de simplemente dividir el conjunto de datos arbitrariamente. Si usted está a cargo de la estructura de la base de datos y no hay una buena razón para dividir los datos, construiría una gran tabla con un campo de "origen" adicional que contiene un código de país, pero probablemente lo haga por razones de rendimiento legítimo . O utilice una unión para unir las tablas que le interesan http://dev.mysql.com/doc/refman/5.0/en/union.html o utilizando el motor de base de datos Merge http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html.

3

Su intento original de abarcar ambas tablas crea un JOIN implícito. Esto es mal visto por la mayoría de los programadores de SQL porque separa las tablas para combinarlas con la condición de cómo.

La UNION es una buena solución para las tablas tal como están, pero no debería haber ninguna razón por la que no puedan colocarse en la misma tabla con índices decentes. He visto agregar el índice correcto a una tabla grande para aumentar la velocidad de consulta en tres órdenes de magnitud.

3

La declaración union causa un tiempo de acuerdo en los datos de gran tamaño.Es bueno para realizar la selección en 2 pasos:

  1. seleccione el ID
  2. a continuación, seleccione la tabla principal con su
Cuestiones relacionadas