【发布时间】:2016-07-14 17:03:25
【问题描述】:
我在尝试使用 LEFT JOINing 多个表并使用可能的额外参数进行“全部搜索”来搜索 MySQL 中的多个值时遇到了一个大问题。请允许我详细说明一个示例:
我有以下数据库结构:
wp_posts
id | post_name
--------------
1 | sword
2 | bow
3 | shield
wp_postmeta
id | post_id | meta_key | meta_value
------------------------------------
1 | 1 | user | 101
2 | 1 | power | 5
3 | 1 | defense | 0
4 | 1 | range | 1
5 | 1 | condi | old
6 | 2 | user | 102
7 | 2 | range | 10
8 | 2 | condi | new
9 | 3 | user | 101
10 | 3 | power | 0
11 | 3 | defense | 10
我正在使用以下内容构建 PHP MySQL 搜索:
1) “所有搜索”输入。搜索任何post_name 或任何meta_value。
2)过滤器输入选择meta_key并输入meta_value
例如在power = '5' 上搜索“剑”过滤器
SELECT *
FROM wp_posts as p
LEFT JOIN wp_postmeta as pm ON p.id = pm.post_id
WHERE (post_name LIKE '%$search_str%' OR meta_value LIKE '%$search_str%')
/* extra filter */
AND (meta_key = '$filter_key' AND meta_value = '$filter_val')
GROUP BY p.id
我的问题:
我总是希望wp_posts 中的每条记录有 1 个结果。
但是由于我的 LEFT JOIN,每个 post_key 和 post_value 都会导致不同的行。
因此,如果我使用多个过滤器(在多个元值上)搜索内容,我将一无所获。
例如在所有搜索中搜索old + 过滤range = 1。
SELECT * FROM wp_posts as p
LEFT JOIN wp_postmeta as pm ON p.id = pm.post_id
WHERE (post_name LIKE '%old%' OR meta_value LIKE '%old%')
AND (meta_key = 'range' AND meta_value LIKE '%1%')
GROUP BY p.id
→ 0 个结果...
所以我知道原因,但我不知道一个好的解决方法...
我知道我可以组 concat 列,但是我不能将 meta_key 和 meta_value 保持不变?有什么好的方法可以做到这一点吗?
(等到你听到我添加带有标签的第三个表并将其添加到我的所有搜索框的问题......)
【问题讨论】:
-
当您使用多个过滤器时,您希望得到一行?还是每个过滤器一行?
-
我想保留
GROUP BY p.id,所以我总是想要 1 个结果。不管有多少过滤器。 -
不确定我是否在关注,你说
i get nothing if i....如果你是什么?发布一个您一无所获的示例,以及您期望获得的实际数据。 -
用示例查询更新了问题。
-
是的,我明白了,现在,您希望得到哪一行? id 4 还是 id 5?还是组合?..
标签: mysql search left-join concatenation group-concat