我想从几张桌子加入一个专栏。
我有:
- 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
答案 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'
(如果不存在)。