为各个项目选择标签

时间:2015-07-20 10:59:28

标签: mysql

我试图通过给定user_id的一个查询来获取每个项目及其各自的标签。

  CREATE TABLE IF NOT EXISTS `items` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `title` varchar(255) NOT NULL,
      `description` mediumtext NOT NULL,
      `user_id` bigint(100) NOT NULL,
      `to_read` tinyint(1) NOT NULL DEFAULT '0',
      `added_at` datetime NOT NULL,
      `created_at` datetime NOT NULL,
      `updated_at` datetime NOT NULL,
      PRIMARY KEY (`id`),
      KEY `user_id` (`user_id`),
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE IF NOT EXISTS `tags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(100) NOT NULL,
  `item_id` int(11) NOT NULL,
  `tag` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `item_id` (`item_id`),
  KEY `user_id` (`user_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

查询:

SELECT tags.tag FROM tags WHERE tags.item_id = 5;

SELECT tag FROM tags t JOIN  items item ON t.item_id = item.id AND t.item_id = 5; 

我的哪些查询对于检索每个项目标记是正确的!

1 个答案:

答案 0 :(得分:2)

如果您只想获取标签,请使用

SELECT tag FROM tags WHERE item_id = 42;

获取所需的项目和标签"左外连接"。否则,将忽略没有标签的项目:

SELECT tag FROM tags t LEFT JOIN  items item ON t.item_id = item.id AND t.item_id = 42;

但请注意,可能会多次获得相同的标记。为避免这种情况,请改用SELECT DISTINCT ...

编辑:以下语句每个项目返回一行,并附加一个列,用于连接该项目的所有标记:

SELECT items.*, 
    (SELECT GROUP_CONCAT(tags.tag) 
       FROM tags 
      WHERE tags.item_id = items.id) AS tags 
FROM items WHERE items.user_id = 0;

如果您决定使用tags_items表切换到三表格布局:

SELECT items.*, 
    (SELECT GROUP_CONCAT(tags.tag) FROM tags 
       WHERE tags.id = tags_items.tag_id) AS tags 
  FROM items 
  LEFT JOIN tags_items 
         ON tags_items.item_id = items.id 
 WHERE items.user_id = 0;