首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个获得嵌套结果的MySQL查询?

一个获得嵌套结果的MySQL查询?
EN

Stack Overflow用户
提问于 2019-05-23 08:56:28
回答 3查看 448关注 0票数 1

我正在开发一个PHP / MySQL分类搜索引擎,人们可以输入一些关键字,结果页面应该:

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

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

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

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

代码语言:javascript
复制
SELECT u.id, u.firstname 
FROM user u 
WHERE 
u.id 
IN (SELECT user_id FROM product WHERE make LIKE '%Porsche%')

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-23 08:59:24

就像这样:

代码语言:javascript
复制
SELECT u.id, u.firstname, p.* 
  FROM user u 
  INNER JOIN product p 
  ON u.id=p.user_id
WHERE p.make LIKE '%Porsche%';
票数 3
EN

Stack Overflow用户

发布于 2019-05-23 09:34:13

我会用“反向”来做这个工作:

  1. 获取所有产品匹配标题与匹配的用户id和名字。
  2. 按用户在PHP中排序结果

有时候,用什么方式做事更快,而不是对MySQL要求太高。MySQL在简单查询上更快,而且只要逻辑正确,PHP就可以很好地对数据进行排序。

下面是一个例子:

1-获取数据(MySQL):

代码语言:javascript
复制
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

我不知道products表中列的完整列表,但是它应该为每一行生成如下内容:

代码语言:javascript
复制
id, make, user_id, user_firstname

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

代码语言:javascript
复制
// 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
    );

}

这应该会产生像这样的结果数组:

代码语言:javascript
复制
1 =>    array(
    'firstname' =>  'Toto',
    'products'  =>  array(
        1   =>  array(
            'make'  =>  'My Porsche'
        ),
        2   =>  array(
            'make'  =>  'Porsche, an history of red cars'
        ),
        //...
    )
),
3   =>  array(
    'firstname' =>  'Titi',
    'products'  =>  array(
        7   =>  array(
            'make'  =>  'Porsche or Ferrari?'
        ),
        10  =>  array(
            'make'  =>  'Why Porsches are so expensive?'
        ),
        // ...
    )
)   
票数 1
EN

Stack Overflow用户

发布于 2019-05-23 09:29:03

查询应该是

代码语言:javascript
复制
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个结果。在你的帖子里,你没有问过任何关于限制的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56271519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档