【问题标题】:Select all items with same categories选择所有具有相同类别的项目
【发布时间】:2014-05-11 17:16:36
【问题描述】:

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

我想要所有 article_ids 的 categorie_ids 1,2,34,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

【问题讨论】:

  • 如果他们有 1,2,3 和 4 怎么办?
  • 1,2,3,4 没问题,因为它是 1,2,3 :)
  • 该键应该是 PRIMARY 并丢失其他索引。 int(10) 和 int(7) 有什么区别?
  • 哪个键应该是主键?而且文章多于类别。
  • 创建表CategoryLinks (article_id INT NOT NULL, category_id INT NOT NULL, PRIMARY KEY (article_id,category_id));

标签: mysql select


【解决方案1】:

...或者如果您喜欢更少的代码...

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)

还有解释...

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

【讨论】:

  • 知道为什么SIMPLE | CategoryLinks | index | NULL | article_id | 4 | NULL |588933 | Using index 有可能的键(NULL)
  • 没有看到您的 DDL?没有。
  • @Strawberry 我添加了我的 Create table 语句,希望对您有所帮助:)
  • @Strawberry 选择项目需要 0.6 秒,不幸的是这对我来说太慢了:/ 任何想法如何改进它?
  • 我只能认为这取决于你的处理器。
【解决方案2】:

有点像

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

这是一种方法。

【讨论】:

    猜你喜欢
    • 2013-11-04
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多