一个MySQL查询以获取嵌套结果?

时间:2019-05-23 08:56:29

标签: mysql

我正在使用PHP / MySQL分类搜索引擎,人们可以在其中输入一些关键字,结果页面应为:

1)列出发布与这些关键字匹配的列表的用户

AND

2)在这些用户名下方,列出与这些关键字匹配的列表

我只想通过一个MySQL查询来实现这一点,但是我不确定是否有可能。

实际上,我可以通过此查询获取用户列表:

SELECT u.id, u.firstname 
FROM user u 
WHERE 
u.id 
IN (SELECT user_id FROM product WHERE make LIKE '%Porsche%')

现在,我想知道如何在同一查询中获取产品列表。如果在一个查询中不可能,那么最优化的方法是什么?

3 个答案:

答案 0 :(得分:2)

类似这样的东西:

SELECT u.id, u.firstname, p.* 
  FROM user u 
  INNER JOIN product p 
  ON u.id=p.user_id
WHERE p.make LIKE '%Porsche%';

答案 1 :(得分:1)

我会以“反向”方式进行工作:

  1. 获取所有与标题匹配且用户ID相匹配的产品,并且 名。
  2. 在PHP中按用户排序结果

有时候,以某种方式做事比尝试向MySQL提出过多要求要快。 只要您的逻辑正确,MySQL就能在简单查询中更快,PHP可以很好地对数据进行排序。

这是一个例子:

1-提取数据(MySQL):

abc+abc

我不知道您产品表中的列的完整列表,但它应该为每一行产生类似的内容:

SELECT p.*, u.id AS user_id, u.firstname AS user_firstname  
FROM `products` AS p 
INNER JOIN `user` AS u ON u.id = p.user_id 
WHERE p.make LIKE '%Porsche%' 
ORDER BY p.make, u.id

2-使用PHP对结果进行排序(假设您使用PDO,我强烈建议这样做):

id, make, user_id, user_firstname

这应该产生一个结果数组,如下所示:

// Data will contain the sorted results
$data = array();
// This variable will be used to be sure results owning by a certain user are children of this user
$curent_index = null;
while($row = $query->fetch(PDO::FETCH_ASSOC)) {
    // Assign index to row user id (if different from current)
    if($current_index != $row['user_id']) {
        $current_index = $row['user_ic'];
    }

    // Create entry matching the user (if doesn't exist)
    if(!array_key_exists($current_index, $data)) {
        $data[$current_index] = array(
            'firstname' =>  $row['firstname'],
            'products'  =>  array()
        );
    }

    // Add product in data user array

    $data[$current_id]['products'][$row['id']] = array(
        'make'  =>  $row['make'],
        // whatever other fields product have
    );

}

答案 2 :(得分:0)

查询应为

SELECT u.id, u.firstname, p.* 
  FROM user u 
  INNER JOIN product p 
  ON u.id=p.user_id
WHERE p.make LIKE '%Porsche%' LIMIT 10;

这将限制前10个结果。在您的帖子中,您没有询问有关限制的任何信息。