MySQL选择行值为Key => Value

时间:2014-03-07 17:10:10

标签: php mysql sql optimization

我在Basecamp中设置了与此类似的MySQL结构:

bc_projects

  

project_id |标题   |   活跃的2618731 | '样本标题'|   1
2618732 | '样本标题2'| 0

bc_todolists

  

todolist_id | project_id |标题
6731098 | 2618731   | '发布状态'
6731099 | 2618731   | '其他名单'

bc_todos

  

todo_id | todolist_id |标题   |   完成|内容
39180738 | 6731098   | '客户签收'| 1366041432 | 'YYYY-MM-DD'
  39180739 | 6731098 | '团队签收'| null | ''

我需要做的是将每个项目的所有项目相关细节分为1行(或其他一些同样有效的SQL)

下一部分甚至是琐事。我想从 bc_todos 获取内容或完成内容,具体取决于内容是 null 还是= 'YYYY-MM-DD'。我试图自己运行这个,但我在这一点上陷入困​​境。以下是我到目前为止的情况:

SELECT 
    bc_projects.title
    (SELECT GROUP_CONCAT(todolist_id SEPARATOR ',') FROM `bc_todolists` WHERE project_id = bc_projects.project_id) AS lists
FROM 
    bc_projects
WHERE 
    bc_projects.active = 1

我知道我现在可以使用查询中的联接列表从 bc_todos 中提取数据,但是键值配对让我头疼。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

不确定这是否是你想要的

选择     a.title,

GROUP_CONCAT(b.todolist_id SEPARATOR ',') AS lists,

CASE WHEN c.content IS NULL

     THEN GROUP_CONCAT(c.completed SEPARATOR ',')

ELSE GROUP_CONCAT(c.content SEPARATOR ',')

END as outlist

FROM bc_projects a

LEFT OUTER JOIN `bc_todolists` b ON a.project_id = b.project_id

LEFT OUTER JOIN bc_todos c ON b.todolist_id = c. todolist_id

WHERE.active = 1