2015-07-20 2 views
0

Я пытаюсь получить каждый элемент и их теги с одним запросом, заданным 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

Ваш вопрос непоследовательный. Вы хотите выполнить запрос на user_id или item_id? – maja

ответ

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 ....

Edit: Следующий оператор возвращает одну строку для каждого элемента, с дополнительным столбцом, объединяющее все теги этого элемента:

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

В случае, если вы решили перейти на макете три стола с a 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; 
+0

В настоящее время я, кажется, получаю два тега для одного и того же элемента, сорт слишком много строк. Считаете ли вы, что эту группу можно использовать? –

+1

@ N000b101 Можете ли вы предоставить некоторые данные примера и желаемый результат? Группа может быть решением, но мне придется угадать ответ, если я не знаю, что вам нужно – maja

+1

@ N000b101 Если у одного элемента есть несколько тегов, вы должны получить одну строку результатов для каждой комбинации элементов/тегов. Разве это не то, что вы хотите? – maja

Смежные вопросы