加入几张表中的数据

时间:2014-03-28 13:17:24

标签: mysql sql

我想从几张桌子加入一个专栏。

我有:

- a table (TableALL) with all names
- 5 tables (table1,..,table5) that have the same structure (columns)
- one table (Description).

我正在寻找类似的东西:

For each name_id from TableALL {
If name_id in Table1 GET desc FROM DEScriptions where descriptions.desc_id=table1.desc_id ELSE write 'x'
If name_id in Table2 GET desc FROM DEScriptions where descriptions.desc_id=table2.desc_id ELSE write 'x'
...
}

结果:

Name_id, Name, Table1, TAble2, ..., Table5
1, Aloha, basic, premium, basic, 'x', 'x' (exist in some tables)
...
33, Zonk, 'x', 'x', 'x', 'x', 'x' (not exist in any table)

更多信息:

TAble1,...,TAble5: id, name, name_id, desc_id
TAbleAll: name_id, name
TAbleDesc, desc_id, desc

2 个答案:

答案 0 :(得分:0)

在基本级别,你需要使用这样的JOIN:

SELECT * FROM allNames AS all 
LEFT JOIN DESCriptions AS desc 
ON all.name_id = desc.id

这会将两个表链接在一起,其中表1中的name_id和另一个表中的id是相同的。它将返回两个表中的所有列,或者您可以用列名

替换*

编辑: 如果我找到你的答案应该如下:

SELECT * FROM allNames as a
LEFT JOIN TAble1 as T1 ON a.name_id = T1.name_id
LEFT JOIN TAble2 as T2 ON a.name_id = T2.name_id
LEFT JOIN TAble3 as T3 ON a.name_id = T3.name_id
LEFT JOIN TAble4 as T4 ON a.name_id = T4.name_id
LEFT JOIN TAble5 as T5 ON a.name_id = T5.name_id
LEFT JOIN TAbleDesc as desc ON (desc.desc_id = T1.desc_id OR desc.desc_id = T2.desc_id OR desc.desc_id = T2.desc_id OR desc.desc_id = T2.desc_id OR desc.desc_id = T2.desc_id)

这应该有用,并且会向你发送所有表格中的所有列 - 只有我遗漏的是用“' x'重新命名空白字段”。 - 它们只会返回空白或空值,具体取决于您如何格式化表格中的列。如果你必须有x - 它可以以编程方式完成,但将列设置为NOT NULL DEFAULT' x'。

会更容易。

答案 1 :(得分:-1)

看起来你想要一些像SQL中的“for-loop”,它不存在。一些程序解决方案有效,但MySQL没有。因此,最接近他的问题的解决方案是使用容器语言创建查询。

你可以做的是你用外语构建查询(也许是php?你没有写过任何关于它的东西),然后运行它。

perl中的示例解决方案:

my $query_sel="SELECT Table1.name";
my $query_from="FROM Table1";
foreach (@allNames) {
    $query_sel=$query_sel.", COALESCE('".$_.", 'x') AS ".$_;
    $query_from=$query_from." LEFT JOIN ".$_." ON Table1.id=".$_.".desc_id";
}

MYSQL->exec($query_sel." ".$query_from);

这个基于JOIN的解决方案提供了NULL -s而不是您希望的'x' - es。这可以通过MySQL中的COALESCE函数来处理。

COALESCE(tableName.columnName, 'x')会准确地为您提供所需内容:列的值(如果存在)和'x'(如果不存在)。