我有这三张桌子,
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'];
答案 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