MySQL-Seleccionar datos de varias tablas con la misma estructura pero diferentes datos
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 para 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 tabla y todo está bien. Sin embargo, a veces se necesitan datos de 2 o más de las tablas y se deben ordenar por una columna definida por el usuario. Aquí es donde estoy teniendo problemas.
Datos columnas:
id, band_name, song_name, album_name, genre
Estado 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 arrojar algo de luz sobre esto por mí?
6 answers
Creo que estás buscando la cláusula UNION, a la
(SELECT * from us_music where `genre` = 'punk')
UNION
(SELECT * from de_music where `genre` = 'punk')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-03 20:00:37
Suena como si estuvieras más feliz con una sola mesa. Los cinco que tienen el mismo esquema, y a veces necesitan ser presentados como si vinieran de una tabla, apuntan a ponerlo todo en una tabla.
Agregue una nueva columna que se puede usar para distinguir entre los cinco idiomas (asumo que es el idioma que es diferente entre las tablas ya que dijo que era para la localización). No te preocupes por tener 4,5 millones de discos. Cualquier base de datos real puede manejar ese tamaño sin problema. Añadir el corregir los índices, y usted no tendrá problemas para tratar con ellos como una sola tabla.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-03 20:00:43
Cualquiera de las respuestas anteriores son válidas, 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'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-03 20:06:50
La columna es ambigua porque aparece en ambas tablas, debería especificar completamente el campo where (u ordenar), como us_music.género o de_music.género, pero por lo general especificaría dos tablas si luego fuera a unirlas de alguna manera. La estructura con la que está tratando se conoce ocasionalmente como una tabla con particiones, aunque generalmente se hace para separar el conjunto de datos en archivos distintos, en lugar de 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 particionar los datos, entonces construiría una tabla grande con un campo adicional de "origen" que contiene un código de país, pero probablemente lo esté haciendo por una razón de rendimiento legítima. Usa una unión para unirte a las tablas que te interesan http://dev.mysql.com/doc/refman/5.0/en/union.html o usando el motor de base de datos Merge http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html .
Su intento original de abarcar ambas tablas crea una COMBINACIÓN implícita. Esto es mal visto por la mayoría de los programadores SQL experimentados porque separa las tablas para ser combinadas con la condición de cómo.
El UNION
es una buena solución para las tablas tal como son, pero no debe haber ninguna razón para que no se puedan poner en la tabla con una indexación decente. He visto agregar el índice correcto a una tabla grande aumentar la velocidad de consulta en tres órdenes de magnitud.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-05 23:51:04
La instrucción union
causa un tiempo de negocio en datos enormes. Es bueno realizar la selección en 2 pasos:
- seleccione el id
- luego seleccione la tabla principal con ella
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-26 05:20:37