MySQL: результат нескольких строк VS результат одной строки

0

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

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'];
  • 1
    Зачем тебе это делать? Правильным способом было бы сделать это по мере того, как ваш результат возвращается, и просто просмотреть результаты, обрабатывая их должным образом. Насколько мне известно, без выполнения запроса для каждого элемента то, что вы ищете, невозможно, и если бы оно было медленнее, чем патока. Возможно, объяснение того, что вы ищете, даст вам лучшее решение.
  • 0
    Спасибо за ответ. Пожалуйста, смотрите мое редактирование выше. Дайте мне знать, если это не имеет смысла. Благодарю.
Показать ещё 2 комментария
Теги:

2 ответа

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
  • 0
    Спасибо Бен. Это здорово выглядит! Собираюсь попробовать это!
  • 0
    Работает отлично, спасибо. Это медленнее, чем несколько?
Показать ещё 12 комментариев
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 будет второй и т.д.

  • 0
    Спасибо бред. Может быть, я должен сделать это так. Я рассматриваю это.
  • 0
    Это определенно возможно сделать и более эффективно, чем курсор / цикл, который вы предлагаете.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню