поиск таблицы по семье с помощью sql - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть эта таблица с именем table:

+-----+--------------------+----------+--------------+------+
| id  |       money        |  family  |     date     | user |
+-----+--------------------+----------+--------------+------+
|  1  |  credit card       |       1  | 2018-01-04   | U123 |
|  2  |  direct transfert  |       1  | 2018-01-04   | U123 |
|  3  |  Wire transfert    |       1  | 2018-01-06   | U123 |
|  4  |  Exchange          |       2  | 2018-01-03   | U123 |
|  5  |  free              |       2  | 2018-01-03   | U123 |
|  6  |  other             |       3  | 2018-01-08   | U123 |
+-----+--------------------+----------+--------------+------+

Я хочу всегда получать результат по семье.Например, если я ищу date >= 2018-01-06, я хочу получить эту таблицу:

+-----+--------------------+----------+--------------+------+
| id  |       money        |  family  |     date     | user |
+-----+--------------------+----------+--------------+------+
|  1  |  credit card       |       1  | 2018-01-04   | U123 |
|  2  |  direct transfert  |       1  | 2018-01-04   | U123 |
|  3  |  Wire transfert    |       1  | 2018-01-06   | U123 |
|  6  |  other             |       3  | 2018-01-08   | U123 |
+-----+--------------------+----------+--------------+------+

Я пробовал этот запрос:

SELECT e.* 
  FROM table e 
 WHERE e.user ='U123' AND e.family IN 
(
    SELECT e2.family 
      FROM table e2 
     WHERE (e2.date >= "2018-01-06") 
) 
 ORDER BY family;

Но я получаю этот результат:

+-----+--------------------+----------+--------------+------+
| id  |       money        |  family  |     date     | user |
+-----+--------------------+----------+--------------+------+
|  1  |  credit card       |       1  | 2018-01-04   | U123 |
|  2  |  direct transfert  |       1  | 2018-01-04   | U123 |
|  3  |  Wire transfert    |       1  | 2018-01-06   | U123 |
|  4  |  Exchange          |       2  | 2018-01-03   | U123 |
|  5  |  free              |       2  | 2018-01-03   | U123 |
|  6  |  other             |       3  | 2018-01-08   | U123 |
+-----+--------------------+----------+--------------+------+

Вы видите, что идентификационный номер 4 и 5 не должен быть там.

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

SELECT e.*
  FROM table e 
 WHERE e.user ='U123' AND e.family IN 
(
    SELECT e2.family 
      FROM table e2 
     WHERE (e2.date >= "2018-01-06") 
       AND (e2.money like "%transf%")
)
 ORDER BY family;

И еще есть результаты по семье.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Проблема с вашим запросом заключается в том, что подзапрос, используемый для IN, также выбирает «семейство» среди других пользователей.

Вы можете исправить это, включив пользователя.

SELECT *
FROM yourtable e 
WHERE e.user = 'U123'
  AND (e.user, e.family) IN (
    SELECT DISTINCT e2.user, e2.family 
    FROM yourtable e2 
    WHERE e2.date >= '2018-01-06'
  )
ORDER BY family;

Но в этом случае, вероятно, лучше использовать EXISTS.
, который ссылается на пользователя и семью.

Затем добавьте эти дополнительные критерии в запрос EXISTS.

SELECT *
FROM yourtable e 
WHERE e.user = 'U123'
  AND EXISTS (
    SELECT 1
    FROM yourtable e2
    WHERE e2.user = e.user
      AND e2.family = e.family
      AND e2.date >= '2018-01-06'
      -- AND e2.money LIKE '%transf%'
  )
ORDER BY family;

Тест на RexTester здесь

0 голосов
/ 02 декабря 2018

Проблема с вашими выборами заключается в том, что вам также необходимо отфильтровать подзапрос по тому же имени пользователя, например:

select e.* 
from table e 
where e.user ='u123' and e.family in 
(
    select distinct e2.family 
    from table e2 
    where 
        e2.user ='u123' and 
        e2.date >= '2018-01-06'
) 
order by e.family
select e.*
from table e 
where e.user ='u123' and e.family in 
(
    select distinct e2.family 
    from table e2 
    where 
        e2.user ='u123' and 
        e2.date >= '2018-01-06' and
        e2.money like '%transf%'
)
order by e.family
...