SQL JOIN变量

时间:2013-08-19 12:46:58

标签: mysql

我有桌子:

任务

  • ID
  • 名称
  • 描述
  • PARENT_ID
  • PARENT_TYPE

账户

  • ID
  • 名称

引线

  • ID
  • 名称

我的查询有效吗

SELECT tasks.name,date_due, tasks.description, accounts.name FROM tasks 
JOIN accounts
on tasks.parent_id = accounts.id
WHERE DATE(date_due) = DATE(NOW() + INTERVAL 1 DAY) AND tasks.assigned_user_id=1

我需要的是让accounts变量 - 它可以是帐户或潜在客户,取决于tasks.parent_type值。

任何提示如何实现这一目标?

1 个答案:

答案 0 :(得分:4)

SELECT tasks.name,date_due, tasks.description,
  CASE WHEN parent_Type = 1 then
    accounts.name
  WHEN parent_Type=2 then
    leads.name
  END as Name
FROM tasks
  LEFT JOIN accounts
    on tasks.parent_id = accounts.id
  LEFT JOIN leads
    on leads.id = tasks.parent_ID
WHERE DATE(date_due) = DATE(NOW() + INTERVAL 1 DAY) AND tasks.assigned_user_id=1

或者,如果您知道ID将不在两个表中的一个表中,那么coalease将起作用。 Coalease获取系列中的第一个非空值。

SELECT tasks.name,date_due, tasks.description,
  coalesce(accounts.name, leads.name) as Name
FROM tasks
  LEFT JOIN accounts
    on tasks.parent_id = accounts.id
  LEFT JOIN leads
    on leads.id = tasks.parent_ID
WHERE DATE(date_due) = DATE(NOW() + INTERVAL 1 DAY) AND tasks.assigned_user_id=1

否则必须编写动态SQL来动态调整表名:其示例如下: 找到了EXECUTE IMMEDIATE concat("select * from ", @table_name, " where a=", @val); http://dev.mysql.com/worklog/task/?id=2793

但是我对这种方法提醒你,因为它没有适当的控制来传入变量,因此会受到SQL注入的影响。