Как я могу выбрать несколько строк от имени одного и того же идентификатора во второй таблице? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть таблица с именем "профиль", как это

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 для поиска, и мне приходится искать при следующих условиях

  • должен совпадать первым, если введенный пользователем профиль тега находится в дБ или нет
  • затем сопоставьте состояние, соответствует ли введенное пользователем состояние любому профилю с этим тегом
  • если выше обоих условий истинно, проверьте, есть ли какой-либо профиль с <= min_aum_price, который пользователь вводит min_price в таблицу таблицы trust_admin_aum </li>

как это

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 голосов
/ 09 мая 2018

Вы можете использовать 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(",");
0 голосов
/ 09 мая 2018

В основном, выберите все подходящие теги для пользователей, затем снова присоедините пользователей к тегам. чтобы получить список всех пользователей с указанным тегом и всех тегов для этих пользователей.

В приведенном ниже запросе псевдоним a id содержит список совпадающих тегов. Alias ​​ 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`;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...