Ok, aquí está mi dilema. Tengo una base de datos configurada con aproximadamente 5 tablas, todas con la misma estructura de datos exacta. Los datos se separan de esta manera con fines de localización y para dividir un total de aproximadamente 4,5 millones de registros.
La mayoría de las veces solo se necesita una mesa y todo está bien. Sin embargo, a veces se necesitan datos de 2 o más de las tablas y es necesario ordenarlos por una columna definida por el usuario. Aquí es donde estoy teniendo problemas.
columnas de datos:
id, band_name, song_name, album_name, genre
Declaración de MySQL:
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 arrojarme algo de luz sobre esto?
sql
mysql
join
mysql-error-1052
Jayrox
fuente
fuente
SELECT
, por ejemplo:(SELECT 'us_music' AS from_table, * FROM us_music WHERE genre = 'punk') UNION ...
(SELECT 1) AS select1 UNION (SELECT 2) AS select2 WHERE select1.id=select2.id
viewCount
ymovieTitle
donde hay una base de datos para cada mes. Une las 12 tablas juntas, lo cual está bien, pero luego obtiene 12 conjuntos de resultados individuales en la salida. ¿Qué pasa si solo desea un conjunto de resultados donde todos los resultados se agrupanmovieTitle
y elviewCount
valor se suma para cadamovieTitle
fila?Parece que te gustaría tener una sola mesa. Los cinco tienen el mismo esquema y, a veces, deben presentarse como si vinieran de un punto de tabla para ponerlo todo en una sola tabla.
Agregue una nueva columna que se pueda usar para distinguir entre los cinco idiomas (supongo que es un idioma que es diferente entre las tablas, ya que dijo que era para la localización). No se preocupe por tener 4,5 millones de registros. Cualquier base de datos real puede manejar ese tamaño sin problemas. Agregue los índices correctos y no tendrá problemas para tratarlos como una sola tabla.
fuente
Cualquiera de las respuestas anteriores es válida, o una forma alternativa es expandir el nombre de la tabla para incluir también el nombre de la base de datos, por ejemplo:
SELECT * from us_music, de_music where `us_music.genre` = 'punk' AND `de_music.genre` = 'punk'
fuente
La columna es ambigua porque aparece en ambas tablas, necesitaría especificar el campo dónde (u ordenar) completamente, como us_music.genre o de_music.genre, pero generalmente especificaría dos tablas si luego las uniera en algo de moda. La estructura con la que está tratando se conoce ocasionalmente como una tabla particionada, aunque generalmente también se hace para separar el conjunto de datos en archivos distintos en lugar de dividir el conjunto de datos arbitrariamente. Si está a cargo de la estructura de la base de datos y no hay una buena razón para dividir los datos, entonces crearía una tabla grande con un campo de "origen" adicional que contiene un código de país, pero probablemente lo esté haciendo por razones legítimas de rendimiento. . Utilice una unión para unir las tablas en las que está interesado http: //dev.mysql.o utilizando el motor de base de datos Merge http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html .
fuente
Su intento original de abarcar ambas tablas crea un JOIN implícito. Los programadores SQL más experimentados desaprueban esto porque separa las tablas que se deben combinar con la condición del cómo.
El
UNION
es una buena solución para las tablas, ya que son, pero no debería haber ninguna razón por la que no se pueden poner en la mesa con la indexación decente. He visto que agregar el índice correcto a una tabla grande aumenta la velocidad de consulta en tres órdenes de magnitud.fuente
La
union
declaración provoca un tiempo de negociación en datos enormes. Es bueno realizar la selección en 2 pasos:fuente