我试图通过给定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;
我的哪些查询对于检索每个项目标记是正确的!
答案 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;