php - MySQL Query从数组值查询另一个表

标签 php mysql arrays

我有一个表,其中一列包含逗号分隔值。 我需要在查询中获取这些值,分解它们,然后对另一个表进行查询。

让我解释一下结构。

表 1:类(class)。 对于此示例,我们担心的列:

courses.id, courses.products

这将返回一个值

$query['id']-> 1000
$query['products']-> 1,5

在查询中,我需要从产品表中提取每个产品的产品名称

所以

products.productname

即使我必须在查询中创建 5 个产品名称列,因为任何人都不应拥有超过 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; 
 } 

最佳答案

针对您的情况的快速解决方案:

$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

如果您不是每秒钟左右导出一次数据,那么您应该可以使用这两个查询。

您现在体验了为什么在单个数据库字段中存储多个以逗号分隔的值是糟糕的数据库设计。如果您正在重组应用程序,这将是重构数据库并将每个产品 <-> 类(class)隶属关系存储在一行中的好时机。如果您的 courses 表只有这两列,您可以这样做:

id   | product
--------------
1000 | 1
1000 | 5

如果您的表有更多与类(class)相关的字段,您应该将列 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 重写它。执行此操作时,您的开销会多一些,但不会很明显,而且比一次重写所有内容要容易得多。

关于php - MySQL Query从数组值查询另一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34925883/

相关文章:

php - 两阶段 in_array 检查存在问题,不允许处理第二条语句

c - 将指针传递给结构数组

php - 如何模仿 Google Analytics utmz-cookie 的创建?

php - mysql查询锁定表

php - Laravel Eloquent 更新 created_at 值

mysql - 表的自增值可以小于最大id吗?

mysql更新另一列为主键值

php - undefined variable 错误(对于占位符)显示在 html 文件中,即使它是在 php 文件中定义的

mysql - 全表扫描,同时尝试消除重复项

java - Odds & Evens 数组实例化