我有一个名为“profile”的表,就像这样
profile_id name state location
1 Alex Houston Park Lane
我有第二个名为“tags”的表,就像这样
tag_id profile_id tag_title
1 1 finance
2 1 accounting
3 1 audit
我有第三个名为“trust_admin_aum”的表,就像这样
tier_d profile _id min_price max_price fee
1 1 400 500 5
2 1 750 1200 12
3 2 900 1500 15
同一个档案可能有多个层次。
我的情况是用户输入标签,州和min_price进行搜索,我必须搜索以下条件
result : {
profile_id : 1,
name : alex,
state : Houston,
location : Park Lane,
tag_title : finance,
tags : finance,accounting
}
我试过这个查询
SELECT p.*, IFNULL(GROUP_CONCAT(t1.tag_title), '') AS tags FROM basicprofile AS p JOIN profile_tags AS t1 ON p.profile_id = t1.profile_id JOIN profile_tags AS t2 ON t1.profile_id = t2.profile_id INNER JOIN trust_admin_aum AS taum ON taum.profile_id = p.profile_id WHERE p.state LIKE '%Houston%' AND t2.tag_title LIKE '%finance%' AND taum.min_price <=800 GROUP BY p.profile_id
但是这个查询会像这样两次返回标签
result : {
profile_id : 1,
name : alex,
state : Houston,
location : Park Lane,
tag_title : finance,
tags : finance,accounting,auditing,finance,accounting,auditing
}
我怎样才能摆脱这两个标签?
答案 0 :(得分:1)
您可以使用GROUP_CONCAT
获取逗号分隔数组中的所有标记,然后将其拆分为对象中的数组。
SELECT p.*, IFNULL(GROUP_CONCAT(t1.tag_title), '') AS tags
FROM basicprofile AS p
JOIN profile_tags AS t1 ON p.profile_id = t1.profile_id
JOIN profile_tags AS t2 ON t1.profile_id = t2.profile_id
WHERE t2.tag_title LIKE '%finance%'
GROUP BY p.profile_id
当您创建对象时,您可以创建标记数组:
obj.tag_title = row.tags == "" : [] ? row.tags.split(",");
答案 1 :(得分:0)
基本上,选择与用户匹配的所有标签,然后再将用户加入标签 以获取具有指定标记的所有用户的列表以及这些用户的所有标记。
在下面的查询中,别名 a id的匹配标记列表。别名 b 是匹配用户的列表。 最后,别名 c 是用户 b 的所有标签的列表。
SELECT
b.*,
c.*
FROM `profile_tags` a
JOIN `basicprofile` b
ON a.`profile_id` = b.`profile_id`
JOIN `profile_tags` c
ON c.`profile_id` = b.`profile_id`
WHERE a.`tag_title` like '%finance%'
GROUP BY b.`profile_id`,c.`tag_title`
ORDER BY b.`profile_id`,c.`tag_title`;