У меня эти три таблицы,
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
Как я могу сделать результат нескольких строк в результатах одной строки?
Или, может быть, результат нескольких строк лучше и быстрее, чем результат одной строки, который я хочу?
EDIT:
причина, по которой я хочу получить результат одной строки, заключается в том, что я могу просто вызвать content_ #, выполнив это,
echo $page['content_1'];
как я называю название,
echo $page['page_title'];
Вы можете сделать это довольно легко, используя 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
Опять же, ваше мышление находится в неправильном месте, это, если это возможно, будет обескуражено, неэффективно и, вероятно, невозможно.
Вместо этого обрабатывайте данные в цикле и делайте с ним то, что вы там хотите, может показаться, что он более неэффективен в цикле, но я уверяю, что это не так.
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 будет второй и т.д.