选择具有相同类别的所有项目

时间:2014-05-11 17:16:36

标签: mysql select

我有一个表CategoryLinks,其中两列(article_id,category_id)都是整数索引的。 这是我独特的索引。

我希望所有包含categorie_ids 1,2,34,5

的article_ids

我尝试使用in(1,2,3,4,5)然后使用php,但它很慢,我认为应该可以使用MySql。

顺便说一下。 CategoryLinks有超过500,000行

感谢您的任何提示!

Show Create table CategoryLinks

CREATE TABLE `CategoryLinks` (
  `article_id` int(10) NOT NULL,
  `category_id` int(7) NOT NULL,
  UNIQUE KEY `Unique` (`article_id`,`category_id`),
  KEY `category_id` (`category_id`),
  KEY `article_id` (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

2 个答案:

答案 0 :(得分:2)

...或者如果您的代码较少......

CREATE TABLE `CategoryLinks` (
  `article_id` int NOT NULL,
  `category_id` int NOT NULL,
  PRIMARY KEY (`article_id`,`category_id`)
);

SELECT COUNT(*) FROM categorylinks;
+----------+
| COUNT(*) |
+----------+
|   107943 |
+----------+

SELECT x.article_id
   FROM categorylinks x
  GROUP
     BY article_id
 HAVING SUM(category_id IN (1,2,3)) = 3
     OR SUM(category_id IN (4,5)) =2;
+------------+
| article_id |
+------------+
|          1 |
...
|      19860 |
+------------+
9573 rows in set (0.06 sec)

和EXPLAIN ......

           id: 1
  select_type: SIMPLE
        table: x
         type: index
possible_keys: NULL
          key: PRIMARY
      key_len: 8
          ref: NULL
         rows: 28719
        Extra: Using index

答案 1 :(得分:0)

这样的东西
Select L1.article_id, "OneTwoThree" as CategoryGroup 
From CategoryLinks L1 On L1.Category_id = 1
inner join CategoryLinks L2 On L2.Category_id = 2 and L2.article_id = L1.article_id
inner join CategoryLinks L3 On L3.Catgeory_id = 3 and L3.article_id = l1.article_id
union 
Select L4.article_id, "FourFive" as CategoryGroup 
From CategoryLinks L4 On L4.Category_id = 4
inner join CategoryLinks L5 On L5.Category_id = 5 and L5.article_id = L4.article_id

将是一种方法。