2012-04-24 2 views
1

С помощью следующего запроса:MySQL JOIN + подзапрос

SELECT p.*, i.*, GROUP_CONCAT(DISTINCT(pc.category_id)) AS post_categories, GROUP_CONCAT(DISTINCT(pt.tag_id)) AS post_tags 
FROM posts AS p 
LEFT JOIN images AS i ON p.post_image = i.image_id 
LEFT JOIN post_categories AS pc ON p.post_id = pc.post_id 
LEFT JOIN post_tags AS pt ON p.post_id = pt.post_id 
WHERE p.post_url="'.$id.'" 

Я возвращаюсь список сообщений в блоге, извлекая:

  1. каждый столбец из таблицы сообщений
  2. каждый столбец из Таблица изображений (для изображения)
  3. a Объединение всех category_id (для публикации)
  4. a conca tenation всех tag_id-х (на должность)

Что это оставляет меня, два поля, которые не очень полезны:

  • строка сцепленных category_id (т.е. «1,3»)
  • и каскадный строка tag_id (т.е. «2,5,8»)

Я действительно хотел бы сделать подзапрос в обоих LEFT JOINS, что позволяет мне, вместо того, возвращающие список:

  • category_name 's (т.е. "медитация, спорт")
  • tag_name' s (т.е. "IOS, PHP, MySQL")

для каждого сообщения.

Я застрял прямо сейчас в подзапросе как для категорий, так и для тегов.

В таблице структуры:


сообщений

post_id, post_title и т.д.


категории

CATEGORY_ID, category_name


теги

tag_id, tag_name


post_categories

post_id, category_id


post_tags

post_id, tag_id


Вопрос: можно ли эффективно делать такие вещи, если да, то как?

Если нет, то я должен просто хранить SELECT * FROM categories в $categories массиве, а затем сравнить каждый category_id в $categories массива каждый пост взорвалось category_id строку в $posts массив каждый раз?

+0

Извиняюсь, я просто был идиотом. – cammil

ответ

1

Вы должны быть в состоянии присоединиться к тегам и категориям таблицы, а затем просто заменить конкатенацию с полями имени. (Также необходимо добавить Distinct на выбор, чтобы не возвращать дублированные основные строки.)

SELECT DISTINCT p.*, i.*, 
    GROUP_CONCAT(DISTINCT(c.category_name)) AS post_categories, 
    GROUP_CONCAT(DISTINCT(t.tag_name)) AS post_tags 
FROM posts AS p 
    LEFT JOIN images AS i ON p.post_image = i.image_id 
    LEFT JOIN post_categories AS pc ON p.post_id = pc.post_id 
    LEFT JOIN post_tags AS pt ON p.post_id = pt.post_id 
    LEFT JOIN categories AS c ON pc.category_id = c.category_id 
    LEFT JOIN tags AS t ON pt.tag_id = t.tag_id 
WHERE p.post_url="'.$_GET['id'].'" 
+0

Спасибо за помощь, я просто слишком долго смотрел на нее и старался сделать ее более сложной, чем она есть! lol –

+0

p.s. если вы можете редактировать 'LEFT JOIN теги AS t ON pc.tag_id = t.tag_id', чтобы сказать' LEFT JOIN теги AS t ON pt.tag_id = t.tag_id', что было бы здорово. Я недавно потерял права на редактирование! :/ –

+1

@MatisseVerDuyn ha, я думаю, что знаю это чувство. (обновленный запрос) – McGarnagle

1

Тогда почему бы не просто захватить соответствующую категорию названия и теги описания вместо их идентификаторов в вашем GROUP_CONCAT