使用以下查询:
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.'"我将返回一个博客帖子列表,检索:
category_id(用于post)tag_ids(用于post)H 211<代码>G 212的级联这给我留下的,是两个没有实际帮助的领域:
我真的很想在两个LEFT JOINS中执行一个子查询,这样我就可以返回以下列表:
category_name's (即“冥想,sports")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数组中,然后每次将$categories数组中的每个category_id与$posts数组中的每个post的爆炸category_id字符串进行比较?
发布于 2012-04-24 22:46:41
您应该能够连接到标记和类别表,然后将连接替换为name字段。(还必须向select中添加,以避免返回重复的主行。)
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'].'"发布于 2012-04-24 22:46:59
那么,为什么不直接在GROUP_CONCAT中获取相应的类别名称和标签描述而不是它们的in呢?
https://stackoverflow.com/questions/10307031
复制相似问题