У меня есть эта таблица с именем 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;
И еще есть результаты по семье.






Проблема с вашим выбором заключается в том, что вам также необходимо отфильтровать подзапрос по тому же имени пользователя, например:
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
Проблема с вашим запросом заключается в том, что подзапрос, используемый для 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 здесь
Большое спасибо за ответ, он мне действительно помог :) :)
Большое спасибо за ответ, я предпочитаю работать с первым ответом, так как он более простой :)