1

私はテーブルを持っています:

タスク

  • ID
  • 名前
  • 説明
  • 親ID
  • 親の種類

アカウント

  • 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ます。

これを達成するためのヒントはありますか?

4

1 に答える 1

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 が 2 つのテーブルのいずれにもないことがわかっている場合は、合体が機能します。Coalease は、一連の最初の非 null 値を取ります。

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);なります

ただし、渡された変数に対して適切な制御が行われていない場合、SQL インジェクションの可能性があるため、このアプローチについては注意が必要です。

于 2013-08-19T12:51:00.497 に答える