用于php标记系统的mysql查询

时间:2017-11-08 21:27:30

标签: php mysql

我正在尝试展示带有标签的文章。下面的查询非常有效。

这是我的疑问:

SELECT
    item.item_id,
    item.item_title,
    item.item_createdate,
    GROUP_CONCAT(tag.tag_name) AS TagName
FROM
    item
LEFT JOIN `item-tag` ON `item-tag`.item_id = item.item_id
LEFT JOIN tag ON tag.tag_id = `item-tag`.tag_id
    /*WHERE item.item_type = 1*/
GROUP BY
    item.item_id
ORDER BY
    item_createdate
DESC

enter image description here enter image description here

当我过滤结果时,我遇到了问题。如果我想查看"标签1"的结果?我添加了where子句:

 WHERE tag.tag_name = 'Tag 1'

这会删除GROUP_CONCAT中的其他标记 我得到了这个结果:

enter image description here

如何获取已标记的文章并显示该文章的其他标记?

2 个答案:

答案 0 :(得分:1)

尝试:

temp = []
for c in ['A','B',C']:
    #create new dataframe for letter
    #append new frame to temp

return pd.concat(temp)

请注意,tag_name上的过滤器不起作用,因为GROUP_CONCAT和GROUP BY逻辑上生成一个更大的表,然后从中连接结果。过早过滤会从较大的表中删除条目,因此标记不会出现在连接中。

另一种方法是将现有查询用作子查询,并用

包围它
WHERE EXISTS 
    (SELECT tag_id FROM tag 
    JOIN `item-tag` tmp ON tag.tag_id = tmp.tag_id 
    WHERE tmp.item_id = item.item_id AND tag.tag_name = 'Tag 1')

答案 1 :(得分:1)

SELECT
  item.item_id,
  item.item_title,
  item.item_createdate,
GROUP_CONCAT(tag.tag_name) AS TagName
FROM
  item
LEFT JOIN `item-tag` ON `item-tag`.item_id = item.item_id
LEFT JOIN tag ON tag.tag_id = `item-tag`.tag_id

--limit your existing query by only including item_ids with 'Tag 1'
WHERE item.item_id IN(
    SELECT `item-tag`.item_id
    FROM tag INNER JOIN `item-tag` ON tag.tag_id=`item-tag`.tag_id
    WHERE tag.tag_name=?
    )

GROUP BY
  item.item_id
ORDER BY
  item_createdate
DESC

请注意,我使用了一个将在预准备语句中使用的占位符。对于PHPMyAdmin,当然只需将值替换为?

个人偏好 - 我会将表格命名为item_tag,这样您就不必使用那些讨厌的反斜杠......