Выбор с условиями, установленными на трех таблицах - PullRequest
0 голосов
/ 28 мая 2018

В запросе, который я пытаюсь построить, находятся три таблицы.

Одна таблица содержит записи проектов, связанных с именем пользователя, работающим над этим проектом.

Table1 | id | ... | userName | ... |

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

Таблица 2 | id | ... | jobTypeId | email | ... |

В последней таблице приведен список идентификаторов типов работ с указанием их названия работы

Таблица 3 | jobTypeId | jobTypeName |

  1. Как бы я былспособен выбирать только проекты из таблицы 1 , где имя пользователя по сравнению с электронной почтой в таблице 2 пользователи с jobTypeIds из Таблица 3 , равными определенному значению (например, "2")

  2. Как сравнить userName с Таблица 1 для отправки по электронной почте Таблица 2 без включения в нее части @ what.com;Сравните только начало электронного письма с именем пользователя

Пример данных

Таблица 1

| id | ... | userName | ... |  
| 1  |     | bDover   |     |  
| 2  |     | dLong    |     |  
| 3  |     | eEddy    |     |  
| 4  |     | dLong    |     |  
| 5  |     | eEddy    |     |  
| 6  |     | bDover   |     |  
| 7  |     | dLong    |     |  
| 8  |     | eEddy    |     |  
| 9  |     | dLong    |     |  
| 10 |     | dLong    |     |  

Таблица 2

| id | ... | jobTypeId | email                    | ... |  
| 1  |     | 1         | bdover@whatever.com      |     |  
| 2  |     | 2         | dLong@whatever.com       |     |  
| 3  |     | 2         | eEddy@whatever.com       |     |  
| 4  |     | 3         | ...@whatever.com         |     |    

Таблица 3

| jobTypeId | jobTypeName |
| 1         | Student     |
| 2         | Teacher     |
| 1         | Admin       |

Ожидаемый результат (с jobTypeId = 2)

| projectId | userName |  
| 2         | dLong    |  
| 3         | eEddy    |  
| 4         | dLong    |  
| 5         | eEddy    |  
| 7         | dLong    |  
| 8         | eEddy    |  
| 9         | dLong    |  
| 10        | dLong    |  

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вы, кажется, хотите:

select t1.projectid, t1.username
from table1 t1 join
     table2 t2
     on t2.email like t1.username || '@%'
where t2.jobtypeid = 2;

Вам не нужно table3, потому что вы сравниваете идентификаторы типов заданий, а не имена.

Вам также следует исправить модель данныхпоэтому table1 использует идентификатор в table2 для join вместо сравнения имен пользователей и электронных писем.

0 голосов
/ 29 мая 2018

Вы можете попробовать:

SELECT
t1.id as ProjectID, t1.userName

FROM
TABLE1 AS t1, 
TABLE2 AS t2, 
TABLE3 AS t3

WHERE
TRIM(t1.userName) = TRIM(split_part(t2.email, "@", 1))
&& t2.jobTypeId = t3.jobTypeId
&& t3.jobTypeId = 2

GROUP BY
ProjectID

Это предполагает, что Postgres split_part () работает так же, как SUBSTRING_INDEX (), как MySQL.

РЕДАКТИРОВАТЬ 2: Если у вас меньше строкдля table2.jobTypeId = 2 ваше предложение WHERE должно выглядеть следующим образом:

WHERE
t3.jobTypeId = 2
&& t3.jobTypeId = t2.jobTypeId
&& TRIM(split_part(t2.email, "@", 1)) = TRIM(t1.userName)

РЕДАКТИРОВАТЬ: я добавил TRIM на всякий случай, если форматирование данных может содержать пробелы в имени пользователя и электронной почте.А вот дополнительная информация об использовании SPLIT_PART () в Postgres: http://dataiseverything.blogspot.com/2015/01/equivalent-of-substringindex-in-mysql.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...