8

嘿,伙计们。因此,我试图找出如何在 mysql 数据库中的多个表中选择每个字段,并将结果表输出到 Excel 的 .csv 文件。我发现了处理 .csv 输出的臭名昭著的 stackoverflow 问题,并且所有代码都在那里。所以,我想我要问的是:

有没有办法做一个看起来像这样的mysql查询?

SELECT * prof.id AS youth_id FROM time time, profiles prof, WHERE foo='bar'

并让它从两个(或类似4个)表中选择所有内容,但选择id作为youth_id,或者如果我需要选择某些值作为另一个名称,我是否必须指定我想要的每个值?

我不想指定每个字段,因为我想输出 50+。

我试图搜索,但无法真正找到我需要的东西。我想如果你能指出我正确的方向,那就太好了。

4

4 回答 4

13

您不必指定每个字段。相反,您可以执行以下操作:

SELECT *, prof.id AS youth_id FROM time time, profiles prof

但是,上面将返回两个表中的所有列以及您重命名的列。因此,如果原来的两个表总共有 4 列,而您重命名其中的一个,您将在结果集中获得 5 列。

于 2011-05-19T23:58:23.657 回答
0

瑞恩,你可以为所欲为。唯一的问题是,结果将同时包含youth_id 和id,它们的值相同。如果您只想要youth_id 而不是id,那么您必须列出您想要的所有列,而不是使用'*'。顺便说一句,如果你手边有 phpmyadmin,你可以直接输入 sql 并立即查看结果。

于 2011-05-19T23:56:55.790 回答
0

好吧,因为没有其他解决方案似乎是完美的,所以我要跳出框框思考一下。如果你不介意打两个电话。一种可能是表模式(存储列名的位置),然后您可以根据需要以编程方式更改名称(无需全部输入)。之后,使用内爆数组作为其 SELECT 部分进行第二次调用。

一个例子:

<?php
$tables = array ('table1','table2','table3');
$NameAliases = array('table1.id'=>'profid');

foreach ($tables as $table)
{
    $sql = "SHOW COLUMNS FROM $table;";
    $result = mysql_query($sql);

    $columns = array();

    while ($row = mysql_fetch_array($result))
    {
        $search = array_search($table.'.'.$row["Field"],$NameAliases);
        if ($search === true)
        {
            $parts = explode('.',$NameAliases[$search]);
            $columns[] = "$table.{$row["Field"]} AS {$parts[1]}"; //get the side of the dot
        }
        else
        {
            $columns[] = "$table.{$row["Field"]}";
        }
    }
}
$columnstring = implode(', ',$columns);
$sql = "SELECT $columnstring FROM ".implode(', ',$tables)." WHERE 1=1";
$result = mysql_query($sql);

while ($row = mysql_fetch_array($result))
{

}
?>

(不知道以上是否有效)

于 2011-05-21T02:09:40.457 回答
0

如果您真的不希望从

SELECT *, prof.id AS youth_id 
FROM time 
INNER JOIN profiles prof 
   ON time.profile_id = prof.id 
WHERE foo = 'bar'

您可以SELECT *从每个表中,除了您希望别名的列的表:

SELECT time.*, prof.id AS youth_id, prof.forename, prof.surname 
FROM time 
INNER JOIN profiles prof 
   ON time.profile_id = prof.id 
WHERE foo = 'bar'

这将为您提供时间的所有列,以及配置文件中的枚举列。您仍然需要枚举表中的所有列,您正在寻找一个列的别名,但至少您不必列出每一个列。

当然,还有一个论点是你应该枚举所有列,以防你的架构在某个时候发生变化,但那是另一回事了。

于 2012-02-01T11:08:11.443 回答