如何在第二个表中代表同一id选择多个行?

thtygnil  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(274)

我有这样一个名为“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

我有第三个表名为“信任管理”

tier_d     profile _id    min_price     max_price    fee
  1           1              400         500          5
  2           1              750         1200        12
  3           2              900         1500         15

同一配置文件可能有多个层。
我的场景是,用户输入标签、状态和最低价格进行搜索,我必须在以下条件下进行搜索
如果用户输入的标签的配置文件是否以db为单位,则应首先匹配标签
然后匹配状态,无论用户输入的状态是否与任何具有该标记的概要文件匹配
如果以上两个条件都为真,那么检查是否有用户在trust\u admin\u aum表中输入min\u price的<=min\u aum\u 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
}

我怎样才能摆脱这个标签?

aiqt4smr

aiqt4smr1#

基本上,选择所有与用户匹配的标记,然后再次将用户加入到标记中,以便获得具有指定标记的所有用户以及这些用户的所有标记的列表。
在下面的查询中,alias是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`;
xxslljrj

xxslljrj2#

你可以用 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(",");

相关问题