MySQL ВЫБРАТЬ ИЗ 3 Таблица с где

0

У меня 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

  • 0
    Вы имеете в виду, что task.uid = 2 AND todo.uid=2 AND timix.uid=2 или task.uid = 2 OR todo.uid=2 OR timix.uid=2 ? эта колонка меня сильно смущает.
  • 0
    извиняюсь. у нас есть дополнительная среда. в таблице задач есть только тид. и TID это идентификатор задачи. и это задачи только подзадачи. Другими словами: у нас нет задач с pid = 0 в таблице задач и поле tid.
Показать ещё 1 комментарий
Теги:

3 ответа

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

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

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
  • 0
    этот запрос не показывает rocords с pid = 0
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. Легче видеть, что подразумевалось под явным.)

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

  • 0
    WHERE task.pid = 0 не работает. потому что mysql видит неизвестные кульминации при выборе только формы todo
  • 0
    @BenDehqan: Извините, я перепутал некоторые вещи. Посмотрите на мою правку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню