У меня 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 и pid = 0 и uid = 2 и timix_status = 0
Поскольку вы не представили ожидаемого результата, я не уверен, что именно вам нужно.
Вот мой подход
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
Но он возвращает тот же набор, что и ваш исходный запрос. Итак, что случилось с этим результатом? какую запись вы хотите исключить? или добавить?
просто,
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
Может быть, вы не хотите вступать, но использовать 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
. Легче видеть, что подразумевалось под явным.)
Это зависит от вашей системы (данных, индексов), которая лучше всего работает.
WHERE task.pid = 0
не работает. потому что mysql видит неизвестные кульминации при выборе только формы todo
task.uid = 2 AND todo.uid=2 AND timix.uid=2
илиtask.uid = 2 OR todo.uid=2 OR timix.uid=2
? эта колонка меня сильно смущает.