MySQL: запрос в зависимости от значения поля - может ли CASE помочь построить ваш запрос? - PullRequest
0 голосов
/ 18 марта 2012

Для простоты есть table1 (id, field1, other_table_id), table2 (id, field1) и table3 (id, field1) , У меня есть SELECT для table1, но в зависимости от значения field1 = 2 или 3, он должен присоединиться к таблице 2 или 3 ... (other_table_id будет либо идентификатором table2, либо table3).

Могу ли я использовать CASE для этого? Если нет, как я могу сделать это лучше всего? Могу ли я сделать это одним запросом?

Большое спасибо заранее!


PS: Я думаю, что это похожая тема: Запрос MySQL, где JOIN зависит от CASE , но я не понял решения. Кроме того, я не понимаю, как использовать CASE из MySQL (http://dev.mysql.com/doc/refman/5.0/en/case-statement.html)...


РЕДАКТИРОВАТЬ: Спасибо за ваш ответ, ypercube! Извините, я описал структуру не совсем правильно. На самом деле таблицы выглядят так:

table1: идентификатор, назначенный_, назначенный_ид rooms_assigned: id, objects_id, room_type_id объекты: id, ...

Итак, у меня есть идентификатор объекта в PHP $ object_id, так как вы используете его в WHERE в запросе?

Согласно вашему ответу, правильный запрос будет выглядеть так?

SELECT COALESCE (ra.objects_id, o.id) AS objects_id
FROM table1 as t
LEFT JOIN rooms_assigned AS ra
ON (ra.id,2)=(t.assigned_id,t.assigned_to)
LEFT JOIN objects AS o ON (o.id,3)=(t.assigned_id,t.assigned_to)

WHERE ?

РЕДАКТИРОВАТЬ 2: Я думаю, что я решил вопрос о "ГДЕ" для себя. Я просто не использовал WHERE в операторе запроса, но добавил его в оба "ON", например, ON (ra.id, ra.object_id, 2) = (t.assigned_id, ". $ Object_id.", T.assigned_to) ...

Еще раз спасибо, вы мне очень помогли! :)

1 Ответ

1 голос
/ 18 марта 2012

Используйте два LEFT соединения и COALESCE() в списке SELECT:

SELECT
    COALESCE(t2.someColumn, t3.someColumn) AS someColumn

FROM
      table1 AS t
  LEFT JOIN
      table2  AS t2
          ON (t2.id, 2) = (t.other_table_id, t.field1)
  LEFT JOIN
      table3  AS t3
          ON (t3.id, 3) = (t.other_table_id, t.field1)
...