2015-08-25 7 views
1

В видео таблице хранятся идентификационные и видеоданные.SQL COUNT с 2 INNER JOINS

Таблица тегов хранит идентификатор и имя_таблицы.

Таблица video_tag соединяет video_ids и tag_ids, чтобы представить, какое видео принадлежит тег.

Например, в запросе ниже, я могу получить видео, которые принадлежат теги с идентификаторами как 3 и 4

Кроме того, я хочу знать, сколько строк есть. Как мне изменить запрос?

SELECT * 
      FROM video 
      INNER JOIN video_tag ON video.id = video_tag.video_id 
      INNER JOIN tag ON tag.id = video_tag.tag_id 
      WHERE video_tag.tag_id IN (3,4) 
      GROUP BY video.id 
      HAVING COUNT(video.id)=2 
      ORDER BY video.id DESC 

*

Таблица структуры:

-- 
    -- Table structure for table `video` 
    -- 

    CREATE TABLE IF NOT EXISTS `video` (
     `id` int(11) NOT NULL AUTO_INCREMENT, 
     `original_id` varchar(20) COLLATE utf8_turkish_ci NOT NULL COMMENT 'alınan sitedeki id''si', 
     `source` tinyint(2) NOT NULL, 
     `title` varchar(160) COLLATE utf8_turkish_ci NOT NULL, 
     `link` varchar(250) COLLATE utf8_turkish_ci NOT NULL, 
     `image` varchar(300) COLLATE utf8_turkish_ci NOT NULL, 
     `seconds` smallint(6) NOT NULL, 
     `fullscreen` varchar(100) COLLATE utf8_turkish_ci NOT NULL, 
     PRIMARY KEY (`id`), 
     KEY `source` (`source`,`seconds`) 
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci AUTO_INCREMENT=122987 ; 

-- 
-- Table structure for table `tag` 
-- 

CREATE TABLE IF NOT EXISTS `tag` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `tag_name` varchar(24) COLLATE utf8_turkish_ci NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `tag_name` (`tag_name`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci AUTO_INCREMENT=191 ; 
-- 
-- Table structure for table `video_tag` 
-- 

CREATE TABLE IF NOT EXISTS `video_tag` (
    `video_id` int(11) NOT NULL, 
    `tag_id` int(11) NOT NULL, 
    KEY `video_id` (`video_id`,`tag_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 
+0

Вы хотите узнать общее количество видео? – aadi

+0

Я думаю, что ваш запрос уже предоставляет вам общее количество строк вместе с подробностями ... если вы хотите просто подсчитать, то вы можете использовать select count (*) и удалить предложение order by по вашему запросу ... –

+0

Если вы хотите что-то а затем объясните это .... –

ответ

1

Ваш запрос должен делать то, что вы хотите. Но, вы можете упростить:

SELECT v.* 
FROM video v INNER JOIN 
    video_tag vt 
    ON v.id = vt.video_id 
WHERE vt.tag_id IN (3, 4) 
GROUP BY v.id 
HAVING COUNT(v.id) = 2 
ORDER BY v.id DESC ; 

Единственный раз, когда это не будет работать, когда видео может иметь повторяющиеся теги одного и того же типа. В этом случае вместо этого вы можете вместо этого использовать COUNT(DISTINCT).

Если вы хотите, чтобы вернуть запрос с количеством строк, скажем, пагинацией, используйте SQL_CALC_FOUND_ROWS:

SELECT SQL_CALC_FOUND_ROWS v.* 
. . . 

Затем используйте FOUND_ROWS().

Если вы просто хотите, количество строк, вы можете использовать подзапрос, и дальнейшее упрощение:

SELECT COUNT(*) 
FROM (SELECT v.* 
     FROM video_tag vt 
     WHERE vt.tag_id IN (3, 4) 
     GROUP BY vt.id 
     HAVING COUNT(*) = 2 
    ) t 
0

Вот полный запрос. Он покажет вам каждое видео, с его общим номером. Надеюсь, поможет.

SELECT v.id, COUNT(v.id) as [Number] 
     FROM video AS v -- using alias 
     INNER JOIN video_tag vt ON v.id = vt.video_id 
     INNER JOIN tag t ON t.id = vt.tag_id 
     WHERE vt.tag_id IN (3,4) -- this is optional; you can remove it 
     GROUP BY v.id 

Не стесняйтесь спрашивать о дальнейшем.

+0

Можно ли дать мне рабочий запрос? Потому что очевидно, что должен быть COUNT, но где? Я пробовал, но была ошибка с идентификатором столбца dublicate. 'SELECT COUNT (*) ОТ \t \t \t (SELECT * из видео INNER JOIN video_tag ПО video.id = video_tag.video_id INNER JOIN тег ВКЛ tag.id = video_tag.tag_id ГДЕ video_tag.tag_id (3 , 4,5) GROUP BY video.id HAVING COUNT (video.id) = 3) AS T' – Tahtakafa

+0

Обратите внимание на использование «псевдонима», поскольку оно дает много удобства. Вам не нужно писать полное имя таблицы. – aadi

0

общее количество vedios в Vedio table-

SELECT count(*) FROM video; 

Всего нет. строк те, существуют в другой реляционной таблице also-

SELECT COUNT(*) 
      FROM video 
      INNER JOIN video_tag ON video.id = video_tag.video_id 
      INNER JOIN tag ON tag.id = video_tag.tag_id 

Общее кол-во строк только для tag_id 3 и 4.

SELECT COUNT(*) 
      FROM video 
      INNER JOIN video_tag ON video.id = video_tag.video_id 
      INNER JOIN tag ON tag.id = video_tag.tag_id 
      WHERE video_tag.tag_id IN (3,4) 

Всего уникальных vedieo ID для tag_id 3 и 4.

SELECT COUNT(distinct video.id) 
      FROM video 
      INNER JOIN video_tag ON video.id = video_tag.video_id 
      INNER JOIN tag ON tag.id = video_tag.tag_id 
      WHERE video_tag.tag_id IN (3,4) 
Смежные вопросы