MySQL ВЫБРАТЬ ИЗ 3 Таблица с где - PullRequest
0 голосов
/ 20 мая 2018

У меня есть 3 таблицы:

Задача:

ID   | UID  | PID   | TITLE    |
1    | 2    | 0     | task 1   |
2    | 2    | 1     | task 1-1 |
3    | 3    | 0     | task 2   |
4    | 2    | 0     | task 3   |
5    | 2    | 0     | task 4   |

Задача:

ID   | UID  | TXID   | TID      | TITLE    |
1    | 2    | 1      | 1        | todo1    |
2    | 2    | 1      | 1        | todo2    |
3    | 3    | 2      | 3        | todo3    |
4    | 2    | 4      | 4        | todo4    |
5    | 2    | 5      | 5        | todo5    |

timix:

ID   | UID  | STATUS   | 
1    | 2    | 0        |
2    | 2    | 1        |
3    | 3    | 0        | 
4    | 2    | 1        | 
5    | 2    | 0        |

Мне нужно выражение, похожее на этот запрос, но исправленное:

SELECT * 
FROM todo,task,timix 
WHERE task.id = todo.tid 
  AND todo.uid=2 
  AND task.pid=0 
  AND timix.id = todo.txid 
  AND timix.status = 0

это описание переменной:

uid = user id
txid = timix id
tid = task id
pid = parent id

мне нужно: показывать задачи с todo`s и pid = 0 и uid = 2 и timix_status = 0

Ответы [ 3 ]

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

просто,

Select t.* from Task t join
todo td on t.ID = td.TID join
timix tx on td.TXID = tx.ID
where t.UID = 2 and tx.STATUS = 0
0 голосов
/ 20 мая 2018

Поскольку вы не предоставили ожидаемого результата, я не уверен, что именно вам нужно.

Вот мой подход

http://sqlfiddle.com/#!9/ec3c88/2

SELECT * 
FROM task
INNER JOIN todo
ON task.id = todo.tid 
  AND todo.uid=2 
INNER JOIN timix 
ON timix.id = todo.txid 
  AND timix.status = 0
WHERE task.pid=0

Но он возвращает тот же набор, что и ваш исходный запрос.Так что не так с этим результатом?какую запись вы хотите исключить?или добавить?

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

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

SELECT *
       FROM task
       WHERE task.pid = 0
             AND EXISTS (SELECT *
                                FROM todo
                                WHERE todo.tid = task.id
                                      AND todo.uid = 2
                                      AND EXISTS (SELECT *
                                                         FROM timix
                                                         WHERE timix.id = todo.txid
                                                               AND timix.status = 0));

Или вы можете захотеть сохранить объединение в подзапросе.

SELECT *
       FROM task
       WHERE task.pid = 0
             AND EXISTS (SELECT *
                                FROM todo
                                     INNER JOIN timix
                                                ON timix.id = todo.txid
                                WHERE todo.tid = task.id
                                      AND todo.uid = 2
                                      AND timix.status = 0);

Другой альтернативой может быть:

SELECT DISTINCT task.* FROM todo,task,timix WHERE task.id = todo.tid AND todo.uid=2 AND task.pid=0 AND timix.id = todo.txid AND timix.status = 0;

DISTINCT выводит результат.(Но рассмотрите возможность использования явного синтаксиса JOIN вместо варианта FROM table1, table2 WHERE table1.attribute1 = table2.attribute2. Проще понять, что подразумевается под явным синтаксисом.)

Это зависит от вашей системы (данных, индексов), которая работает лучше всего.

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