我有一个表,其中一列包含逗号分隔值。 我需要在查询中获取这些值,将它们分解并对另一个表执行查询。
让我解释一下结构。
表1:课程。 我们担心这个例子的列:
courses.id, courses.products
这将返回一个值
$query['id']-> 1000
$query['products']-> 1,5
在查询中,我需要从产品表中提取每个产品的产品名称
所以
products.productname
即使我必须在查询中创建5个productname列,因为没有人应该有超过5个产品。
所有这一切的要点是我必须将其转储到电子表格中,我需要在那里有产品名称。
要完成CSV转储,我有这个代码。 (我已经编写了查询,但现在只返回" 1,5"而不是产品名称
$query = " QUERY GOES HERE ";
$result = mysql_query($query, $db) or die(mysql_error());
if (!$result) die('Couldn\'t fetch records');
$num_fields = mysql_num_fields($result);
$headers = array();
for ($i = 0; $i < $num_fields; $i++)
{
$headers[] = mysql_field_name($result , $i);
}
$fp = fopen('php://output', 'w');
if ($fp && $result)
{
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="export.csv"');
header('Pragma: no-cache');
header('Expires: 0');
fputcsv($fp, $headers);
while ($row = mysql_fetch_row($result))
{
fputcsv($fp, array_values($row));
}
die;
}
答案 0 :(得分:0)
针对您的案例的快速解决方案:
$course_id = intval( $_GET['id'] );
// get the id 1000
$result = mysql_query( "SELECT `products` FROM `courses` WHERE `id`=" . $course_id );
$course = mysql_fetch_assoc( $result ) or exit( "Invalid ID" );
$result = mysql_query( "SELECT `id`,`productname` FROM `products` WHERE `id` IN (".$course['products'].")" );
// this will result in "SELECT id,productname FROM products WHERE id IN (1,5)"
//
// rest of your code
如果您不是每秒都要导出数据,那么这两个查询就可以了。
您现在体验到为什么在单个数据库字段中存储多个以逗号分隔的值的数据库设计是错误的。如果您正在重组应用程序,那么现在是重构数据库并存储每个产品的好时机&lt; - &gt;课程从属关系。如果您的courses
表只有这两列,您可以这样做:
id | product
--------------
1000 | 1
1000 | 5
如果您的表格中包含与课程相关的更多字段,则应将列products
移至其自己的表格中,如上图所示。这是多对多关系的常用数据库结构。
最初我希望通过其中一个查询将结果放在一个查询中,但出于某种原因,我总是只有一条记录,而且我目前没有时间深入研究它。
-- try #1
SELECT products.id,products.productname
FROM products JOIN courses ON products.id IN (courses.products)
WHERE courses.id=1000
-- try #2
SELECT products.id,products.productname
FROM products
WHERE products.id IN (
SELECT courses.products
FROM courses
WHERE courses.id=1000
)
最后,但并非最不重要的是,您已经获得了停止使用已弃用的mysql_*
函数的建议。我知道重写现有的应用程序很困难,我自己一直在这条路上。我的经验是,最好在此过程中执行此操作,只需使用mysqli或PDO定义第二个数据库连接,无论您更熟悉。每次更改脚本中与数据库相关的内容都会使用较新的API重写它。当你这样做时,你会有更多的开销,但不会明显,这比一次重写所有内容更容易。