【问题标题】:PHP mysql LEFT JOIN outputPHP mysql 左连接输出
【发布时间】:2012-08-14 16:57:46
【问题描述】:

我在 apache 上运行 php-script。每次用户访问特定 URL 时,他/她都会得到 csv-file。

这样获取列名(感谢 Daniel Figueroa :)

$csv_output .= "\n";
// get the column name from the first DB (ins.data)
mysql_select_db($db, $link) or die("Can not connect to DB1.");
$result = mysql_query("SHOW COLUMNS FROM ".$table." WHERE Field NOT IN
('ID','Key','Text')");
$i = 0;
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
$csv_output .= $row['Field']."; ";
$i++;
}
}

// get the column names from the second DB (Cu.data)
mysql_select_db($db2, $link) or die("Can not connect to DB2.");
$result = mysql_query("SHOW COLUMNS FROM ".$table2." ");
 ;
$i = 0;
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
    $csv_output .= $row['Field']."; ";
    $i++;
}
}
$csv_output .= "\n";

PHP 脚本的实际查询是这样的:

$values = mysql_query(" SELECT ins.data.`Date`,  ins.data.`Number`, 
 ins.data.`Email`, ins.data.`TargetId`, ins.data.`CSW`,
 ins.data.`TSW`, ins.data.`CType`,
 Cu.data.`Cus`, Cu.data.`Co`,Cu.data.`Ci`,
 Cu.data.`SID`, Cu.data.`SType` 
 FROM ins.data
 LEFT JOIN  Cu.data ON (ins.data.TargetId = Cu.data.TargetID)
 ORDER BY ins.data.ID DESC");

'desc' 的输出:

mysql> desc ins.data;
+-------------------+------------------+------+-----+---------------------+----------------+
| Field             | Type             | Null | Key | Default             | Extra          |
+-------------------+------------------+------+-----+---------------------+----------------+
| ID                | int(10) unsigned | NO   | PRI | NULL                | auto_increment |
| Date              | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
| Number            | text             | NO   |     | NULL                |                |
| Text              | text             | NO   |     | NULL                |                |
| Email             | text             | NO   |     | NULL                |                |
| TargetId          | varchar(20)      | NO   |     | NULL                |                |
| CSW               | text             | NO   |     | NULL                |                |
| TSW               | text             | NO   |     | NULL                |                |
| Key               | text             | NO   |     | NULL                |                |
| CType             | text             | NO   |     | NULL                |                |
+-------------------+------------------+------+-----+---------------------+----------------+
10 rows in set (0.00 sec)

mysql> desc Cu.data;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| Title    | decimal(15,0) | NO   |     | NULL    |       |
| Cu       | text          | NO   |     | NULL    |       |
| Co       | text          | NO   |     | NULL    |       |
| Ci       | text          | NO   |     | NULL    |       |
| SID      | text          | NO   |     | NULL    |       |
| TargetID | varchar(20)   | NO   | MUL | NULL    |       |
| SType    | text          | NO   |     | NULL    |       |
| empty1   | int(11)       | NO   |     | NULL    |       |
| empty2   | int(11)       | NO   |     | NULL    |       |
| empty3   | int(11)       | NO   |     | NULL    |       |
| empty4   | int(11)       | NO   |     | NULL    |       |
| empty5   | int(11)       | NO   |     | NULL    |       |
| empty6   | int(11)       | NO   |     | NULL    |       |
| empty7   | int(11)       | NO   |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
12 rows in set (0.00 sec)

更新 3:

这不再是 NATURAL LEFT JOIN 问题。替换为 LEFT JOIN。

将字段 empty1-5 添加到 ins.data 以将数据获取到 csv 文件。没有字段 empty1-5,只有来自第一个 db (ins.data) 的数据在 csv.file 上。

现在我有所有字段的数据,但 csv 上的字段(或 excel 上的列名)名称顺序错误,不需要的字段(列)像 Title 和 empty1-5 一样可见。

任何想法如何解决这个问题?在没有“SHOW COLUMNS”的情况下将字段名称获取到 csv 文件的其他方法?

我可以在 csv 文件值的开头写上我想要的“echo”。 IE “日期;编号;电子邮件;TargetID,CSW;TSW;CType;Cu;SID;Co;Ci;SType;”但我是 PHP 新手,我不知道怎么做 :(

另一个问题是,如果字段 ID 是 excel 上的第一列,则 excel 无法处理,必须从 SHOW COLUMNS 输出中排除。

UPDATE4:向 DB2 (Cu.data) 添加更多空字段并重新排序 SQL 查询,现在所有值都可见且顺序正确。

【问题讨论】:

  • 在我的编辑中查看更新的语法示例

标签: php mysql left-join


【解决方案1】:

编辑

首先,您的表命名架构很奇怪且不寻常......但假设我理解正确,那么这个查询应该可以工作(如果它没有重命名您的表而不使用点(句点)以减少混乱:

mysql_query('SELECT ins.data.Date, ins.data.Number, ins.data.Email, ins.data.TID, ins.data.CSW, ins.data.TSW, ins.data.CType, CU.data.SID, cu.data.SType, cu.data.CU, cu.data.CO, cu.data.Ci, FROM ins.data, cu.data ORDER BY ins.data.ID DESC');

根据 mysql_query 函数参考,在 PHP 中使用 mysql_query 时数据不应以分号结尾...我从来没有把分号放在那里,所以我从来没有遇到过问题,这就是我最初注意到你的脚本(正如我所说,我从未尝试过,所以我不知道这是否是问题所在)。应该是:

$values = mysql_query("SELECT Date, Number, Email, TID, CSW, TSW, CType, SID, SType, Cu, Co, Ci FROM ins.data NATURAL LEFT JOIN Cu.data ORDER BY ID DESC");

另外,在做 JOINS 时,通常你指定什么列属于什么表......就像这里的标准 mysql 示例:

<?php
// Make a MySQL Connection
// Construct our join query
$query = "SELECT family.Position, food.Meal ".
 "FROM family LEFT JOIN food ".
    "ON family.Position = food.Position"; 

$result = mysql_query($query) or die(mysql_error());


// Print out the contents of each row into a table 
while($row = mysql_fetch_array($result)){
    echo $row['Position']. " - ". $row['Meal'];
    echo "<br />";
}
?>

我也不总是使用 JOIN 命令...您可以使用如下替代语法:

mysql_query('SELECT ... FROM t1, t2, t3 WHERE t1.b = t2.b AND t2.c = t3.c AND t1.a = t3.a');

【讨论】:

  • 好的。超出能力。 t1/t2/t3 是表格,但 t1.b 是什么?
  • 假设我有两个表...例如,一个表称为“用户”,另一个表称为“cmets”...例如,如果用户发表了评论并且我想要要检索它,我可以使用这样的语法(为您提供一个了解您的数据库结构的解决方案会更容易): mysql_query('SELECT users.username, cmets.comment FROM users, cmets WHERE users.user_id = cmets.user_id') ; --- 在这个例子中,我们有 user_id 的共享 id 来比较表与表
  • 哇。几乎完美地工作。我的意思是“SELECT ins.data.Date 等”我在 ins.data 上有 979 行,而 cu.data 有 1521 行。您的查询输出大约 144 万行(来自命令行的 SQL)。我的浏览器仍在等待 csv :D
  • 用户通过 WWW 向 ins.data 插入数据(目前有 979 个条目)。 php-script 创建包含 979 行的 csv 文件,并从 Cu.data 附加信息中获取 csv。
  • 979 * 1521 = 1489050 这就是 php-script 现在正在做的事情。
【解决方案2】:

尝试在表名上加上别名。它也会使查询更具可读性:

SELECT 
    i.`Date`, i.Number, i.Email, i.TID, i.CSW, i.TSW, i.CType, 
    c.Cu, c.Co, c.Ci, c.SID, c.TID, c.SType  
FROM 
    ins.data AS i
  LEFT JOIN 
    Cu.data AS c
      ON i.TID =  c.TID 
ORDER BY 
    i.ID DESC ;

【讨论】:

  • 有趣,通过命令行直接 SQL 给出错误:错误 1054 (42S22):“字段列表”中的未知列“ins.data.Date”。仅从 i.data 查询 i.Date、i.Number、iEmail 没有任何连接是可以的。我的查询中没有发现任何拼写错误。
  • 你可以尝试编辑吗(在Date周围加上反引号:i.`Date`
  • 是时候与此保持距离了。可能明天继续故障排除。感谢 Jeffery 和 ypercube 迄今为止的帮助!
  • 问题大概出在PHP代码上。不知道你为什么让事情复杂化(使用SHOW COLUMNS查找返回的列的名称)。
  • 这太令人沮丧了!我的解决方法; cron 调用 shell-script 和电子邮件 csv 工作正常,但这个该死的 PHP 不起作用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 2012-11-13
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
相关资源
最近更新 更多