MySQL - 在一个查询中从不同表中选择多行

Posted

技术标签:

【中文标题】MySQL - 在一个查询中从不同表中选择多行【英文标题】:MySQL - Select multiple rows from different table in one query 【发布时间】:2022-01-18 02:51:36 【问题描述】:

我有 2 个表“products”和“products_images”。我想在同一个查询中加载每个产品及其图像,然后 json_encode 然后将其发送到前端。

products table
+----+----------------+-------+
| id | product_name   | price |
+----+----------------+-------+
| 1  | product name 1 | 15    |
+----+----------------+-------+
| 2  | product name 2 | 23.25 |
+----+----------------+-------+
| 3  | product name 3 | 50    |
+----+----------------+-------+


product_images table
+----+------------+-----------------------------------------------------+
| id | product_id | image                                               |
+----+------------+-----------------------------------------------------+
| 1  | 1          | e5j7eof75y6ey6ke97et5g9thec7e5fnhv54eg9t6gh65bf.png |
+----+------------+-----------------------------------------------------+
| 2  | 1          | sefuywe75wjmce5y98nvb7v939ty89e5h45mg5879dghkjh.png |
+----+------------+-----------------------------------------------------+
| 3  | 1          | 7u5f9e6jumw75f69w6jc89fwmykdy0tw78if6575m7489tf.png |
+----+------------+-----------------------------------------------------+

我希望查询返回这个


  id: 5,
  product_name: 'product name 1',
  price: 25.23,
  images: [
   
    id: 1,
    image: 'e5j7eof75y6ey6ke97et5g9thec7e5fnhv54eg9t6gh65bf.png'
   ,
   
    id: 2,
    image: 'sefuywe75wjmce5y98nvb7v939ty89e5h45mg5879dghkjh.png'
   ,
  ]

我所做的是在 php 中对每个产品进行循环,然后加载它的图像,但我不认为这是最好的解决方案或最佳性能。

【问题讨论】:

您是使用框架还是仅使用 PDO 来查询数据库? @IGP 我只使用 PDO 您可以通过执行 2 个单独的查询并操作结果数组来实现它。 我实际上是通过加载多个产品然后在每个产品上循环以获取它的 id 然后加载它的图像并将它们合并在一起来做到这一点的。我只想知道有没有更好的方法 您可以加载所有图像,然后将它们与产品合并。我在下面发布了一些示例代码 【参考方案1】:
/**
 * Results from a SELECT * FROM products query
 */
$products = [
  [
    'id' => 1,
    'product_name' => 'product name 1',
    'price' => 15,
  ],
  [
    'id' => 2,
    'product_name' => 'product name 2',
    'price' => 23.25,
  ],
  [
    'id' => 3,
    'product_name' => 'product name 3',
    'price' => 50,
  ],
];

/**
 * Results from either
 * SELECT * FROM images
 * or
 * SELECT * FROM images WHERE product_id IN (?,?,?, ...) <- product ids
 */
$images = [
  [
    'id' => 1,
    'product_id' => 1,
    'e5j7eof75y6ey6ke97et5g9thec7e5fnhv54eg9t6gh65bf.png'
  ],
  [
    'id' => 2,
    'product_id' => 1,
    'sefuywe75wjmce5y98nvb7v939ty89e5h45mg5879dghkjh.png'
  ],
  [
    'id' => 3,
    'product_id' => 1,
    '7u5f9e6jumw75f69w6jc89fwmykdy0tw78if6575m7489tf.png'
  ],
];

foreach ($products as $i => $product) 
  $products[$i]['images'] = array_filter($images, function ($image) use ($product) 
    return $image['product_id'] === $product['id'];
  );


var_export($products);

【讨论】:

【参考方案2】:
SELECT p.product_id, i.image_png, ...
    FROM products AS p
    JOIN images AS i   ON i.product_id = p.product_id
    WHERE ...
    ORDER BY ...

然后,在一个循环中

echo "<img src='...$image_png ...'>";

如果您希望图像可点击,请添加“锚点”。如果需要,添加描述性信息。

我认为不需要 json。

如果您要“过滤”,通常将其构建到SELECT 语句中会更有效。

【讨论】:

以上是关于MySQL - 在一个查询中从不同表中选择多行的主要内容,如果未能解决你的问题,请参考以下文章

在一个查询中从两个 mysql 表中选择数据

MySQL - 在一个查询中更新具有不同值的多行

从 MySQL 查询中从百万行中选择第 N 条记录

在 MySQL PHP 中从多行结果中分离行

如何从 SQL Server 中包含多行数据的 2 个表中选择 4 个不同的值?

如何在 Redshift 中从不同数据库中选择表