如何在第二个表中代表相同的ID选择多行?

时间:2018-05-08 21:04:07

标签: mysql node.js join

我有一个名为“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进行搜索,我必须搜索以下条件

    如果用户输入的标签配置文件在db或不是,则
  • 标签应首先匹配
  • 然后匹配状态,即用户输入的状态是否与具有该标记的任何配置文件匹配
  • 如果以上两个条件都为真,则检查是否有任何配置文件具有< = min_aum_price,用户在trust_admin_aum表格中输入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
}

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

2 个答案:

答案 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`;