我有一个表CategoryLinks
,其中两列(article_id,category_id
)都是整数索引的。
这是我独特的索引。
我希望所有包含categorie_ids 1,2,3
或4,5
我尝试使用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
答案 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
将是一种方法。