好的,这是我的困境我有一个数据库设置,大约有5个表都具有完全相同的数据结构。这些数据以这种方式分开以用于本地化目的,并且总共分割了大约450万条记录。

大多数时候只需要一张桌子,一切都很顺利。但是,有时需要从2个或更多表中获取数据,并且需要按用户定义的列进行排序。这就是我遇到问题的地方。

数据列:

id, band_name, song_name, album_name, genre

MySQL陈述:

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

MySQL吐出这个错误:

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

显然,我做错了。有人愿意为我解释一下吗?

有帮助吗?

解决方案

我认为您正在寻找 UNION 条款,a la

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

其他提示

这听起来像是一张桌子上的傻瓜。五个具有相同的模式,有时需要呈现,好像它们来自一个表指向将它们全部放在一个表中。

添加一个新列,可用于区分五种语言(我假设它的语言在表中是不同的,因为你说它是用于本地化的)。不要担心有450万条记录。任何真正的数据库都能处理这个大小没问题。添加正确的索引,您可以毫不费力地将它们作为单个表格处理。

上述任何答案都是有效的,或者另一种方法是扩展表名以包含数据库名称 - 例如:

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

该列不明确,因为它出现在两个表中,您需要完全指定where(或sort)字段,例如us_music.genre或de_music.genre,但如果您要加入,通常会指定两个表他们以某种方式在一起。您处理的结构有时被称为分区表,尽管通常也是将数据集分成不同的文件而不是仅仅任意分割数据集。如果您负责数据库结构并且没有充分的理由对数据进行分区,那么我将构建一个带有额外“原点”的大表。包含国家/地区代码的字段,但您可能出于合法的性能原因而这样做。 使用联合加入您感兴趣的表格 http:/ /dev.mysql.com/doc/refman/5.0/en/union.html 或使用Merge数据库引擎 http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html

您跨越两个表的原始尝试会创建一个隐式JOIN。这是大多数有经验的SQL程序员所不喜欢的,因为它将表分开以与如何组合。

UNION 对于表来说是一个很好的解决方案,但是没有理由不能将它们放入具有合适索引的表中。我已经看到将正确的索引添加到一个大表增加查询速度三个数量级。

union 语句会导致大量数据中的交易时间。最好分两步执行选择:

  1. 选择ID
  2. 然后用它选择主表
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top