MySQL-从结构相同但数据不同的多个表中选择数据


79

好的,这是我的难题,我建立了一个数据库,其中包含约5个表,所有表都具有完全相同的数据结构。出于本地化目的,以这种方式分离了数据,并总共分割了约450万条记录。

在大多数情况下,只需要一张桌子就可以了。但是,有时需要两个或两个以上表中的数据,并且需要按用户定义的列对其进行排序。这就是我遇到的问题。

数据列:

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

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

Answers:


177

我认为您正在寻找UNION子句,

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

@ mihai-limban-抱歉打扰您,但是有一种方法可以从结果集中识别“哪个结果来自哪个表”。因为,如果我们需要从该结果集中更新/删除记录,则无法知道。
web-nomad 2012年

7
@Pushpesh为每个添加唯一的字符串标识符SELECT,例如:(SELECT 'us_music' AS from_table, * FROM us_music WHERE genre = 'punk') UNION ...
jkrcma 2012年

genre的值是什么,未知,但ID应该在两个表中匹配?你可以做这样的事情吗?(SELECT 1) AS select1 UNION (SELECT 2) AS select2 WHERE select1.id=select2.id
ZurabWeb

完美,正是我为什么喜欢Stack!Google,已经在这里找到堆栈问题和答案!谢谢!
Rocco The Taco

在结果集的UNION上进行分组,然后执行by by的语法是什么?比方说,它是viewCountmovieTitle那里有一个DB每月。您可以将所有12个表合并在一起,这很好,但随后在输出中将获得12个单独的结果集。如果您只想要一个结果集,将所有结果分组,movieTitle然后将viewCount每一movieTitle行的值相加,该怎么办?
anon58192932 '19

19

听起来您会像一个桌子一样闲逛。这五个具有相同的架构,有时甚至需要呈现出来,就好像它们来自一个表指向将它们全部放在一个表中一样。

添加一个新列,该列可用于区分五种语言(我假设表中的语言不同,因为您说的是本地化)。不必担心拥有450万条记录。任何真实的数据库都可以处理该大小,没有问题。添加正确的索引,您将毫无困难地将它们作为一个表进行处理。


我最初将所有数据存储在一个表中,但是在存储了约350万条记录后,它开始几乎爬行了5-10秒。我发现将其拆分对我来说效果最好,因为拆分速度更快。我现在有一个新的虚拟主机,可能会更好,但是合并起来似乎太麻烦了
Jayrox

26
听起来您需要向表中添加索引。
Ned Batchelder

1
是的,您实质上是在没有解决核心问题(索引编制不正确/索引不足)的情况下解决了问题的症状。如果您的5个表之一达到450万行并再次开始爬网,接下来会发生什么?
Lo-Tan

5

以上任何答案都是有效的,或者一种替代方法是扩展表名以使其也包括数据库名-例如:

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

这给您一个非常不确定的结果集:us_和de_ punk的所有可能的对。
David Schmitt,2009年

4

该列含糊不清,因为它同时出现在两个表中,您需要完全指定where(或排序)字段,例如us_music.genre或de_music.genre,但是如果要随后将两个表连接在一起,通常会指定两个表一些时尚。您处理的结构有时被称为分区表,尽管通常是将数据集也拆分为不同的文件,而不是随意拆分数据集。如果您负责数据库结构,并且没有充分的理由对数据进行分区,那么我将使用包含国家/地区代码的额外“来源”字段来构建一个大表,但是出于合理的性能考虑,您可能会这样做。可以使用联合来联接您对http://dev.mysql感兴趣的表或使用合并数据库引擎http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html


3

您最初跨越两个表的尝试会创建一个隐式JOIN。对于大多数经验丰富的SQL程序员来说,这是不满意的,因为它将表与要如何组合的条件分开。

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


3

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

  1. 选择编号
  2. 然后选择主表
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.