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í?

Author: OMG Ponies, 2009-01-03

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')
 168
Author: Mihai Limbășan,
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.

 19
Author: Ned Batchelder,
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'
 5
Author: Moo,
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 .

 3
Author: ,
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:12:00

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.

 3
Author: staticsan,
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:

  1. seleccione el id
  2. luego seleccione la tabla principal con ella
 3
Author: mehdi mohamadi,
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