MySQL:多行结果VS单行结果

时间:2012-02-17 21:37:02

标签: php mysql sql

我有这三张桌子,

page

page_id    page_title
1          a

content

content_id   content_text
1            text one
2            text two

content structure

page_id     content_id     order_in_page
1           1              1
1           2              2

我的工作sql,

SELECT 
    p.*,
    c.*,
    x.*

FROM pages AS p

LEFT JOIN pages_structures AS x
ON x.page_id = p.page_id

LEFT JOIN  pages_contents AS c
ON c.content_id = x.content_id

WHERE p.page_url = 'a'

结果,

page_id   page_title   content_text    order_in_page
1         a            text one        1    
1         a            text two        2

我追求的结果

page_id   page_title   content_1   content_2    content_3    content_4
1         a            text one    text two     null         null

如何将多行结果转换为单行结果?

或许多行结果比我想要的单行结果更好更快?

修改

我想要单行结果的原因是我可以通过执行此操作来调用content_#,

echo $page['content_1'];

就像我打电话给标题一样,

echo $page['page_title'];

2 个答案:

答案 0 :(得分:2)

再一次,你的想法是错误的,这个,如果有可能的话,会气馁,效率低下,而且可能是不可能的。

相反,处理循环中的数据并按照你想要的那样处理它,它似乎在循环中效率更低,但我保证它不是。

foreach ($dataFromSQL as $data) {
    $page[] = $data;
}

// Later on when you want to access it:
echo $page[0]['page_title'];
echo $page[0]['content_text'];

其中0表示第一行,1表示第二行等。

答案 1 :(得分:1)

您可以使用GROUP BY并为要转置的每列添加IF语句,轻松完成此操作。当MAX计算时,它将始终将非空值评估为大于NULL。

SELECT
   page_id,
   page_title, 
   MAX(IF(order_in_page = 1, content_text, NULL)) AS content_1,
   MAX(IF(order_in_page = 2, content_text, NULL)) AS content_2,
   .
   .
   .
FROM 
   pages AS p LEFT JOIN 
   pages_structures AS x ON x.page_id = p.page_id LEFT JOIN  
   pages_contents AS c ON c.content_id = x.content_id
WHERE
   p.page_url = 'a'
GROUP BY page_id