MySQL: результат нескольких строк VS результат одной строки - PullRequest
0 голосов
/ 18 февраля 2012

У меня есть эти три таблицы,

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 ]

2 голосов
/ 18 февраля 2012

Опять же, ваше мышление не в том месте, это, если это возможно, будет обескуражено, неэффективно и, вероятно, невозможно.

Вместо этого обрабатывайте данные в цикле и делайте с ними все, что хотите, может показаться, что в цикле это более неэффективно, но уверяю, что это не так.

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 голос
/ 18 февраля 2012

Вы можете сделать это довольно легко, используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...