我有这三个表,
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'];
同样,你的想法是错误的,
相反,在循环中处理数据并按照您的意愿处理它,
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将是第二行等。
您可以很容易地使用GROUP BY
和IF
语句来实现这一点。当MAX进行求值时,它将始终将非null值求值为大于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