我正在使用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%')
现在,我想知道如何在同一查询中获取产品列表。如果在一个查询中不可能,那么最优化的方法是什么?
答案 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)
我会以“反向”方式进行工作:
有时候,以某种方式做事比尝试向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个结果。在您的帖子中,您没有询问有关限制的任何信息。