检查其他列中的匹配项

时间:2011-10-01 21:46:16

标签: mysql

我正在尝试构建一个提供这些结果的SQL查询:

  | Category Title | Subcategory Of |
  -----------------------------------
  |   Category 1   |                |
  |   Category 2   |                |
  |   Category 3   |                |
  |   Category 4   |                |
  |   Category 5   |                |
  |   Category 6   |   Category 4   |
  |   Category 7   |   Category 5   |

这就是我的数据库:

CREATE TABLE `categories` (
  `category_id` int(4) NOT NULL AUTO_INCREMENT,
  `subcategory_id` int(4) NOT NULL,
  `category_title` longtext COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`category_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `categories` (`category_id`, `subcategory_id`, `category_title`) VALUES
(1, 0, 'Category 1'),
(2, 0, 'Category 2'),
(3, 0, 'Category 3'),
(4, 0, 'Category 4'),
(5, 0, 'Category 5'),
(6, 4, 'Category 6'),
(7, 5, 'Category 7');

我认为你会使用JOIN,但我无法在心理上想到要运行什么样的查询,因为据我所知JOIN是加入两个,而不是两个列。我是这些高级查询的新手(虽然我很喜欢INSERT,UPDATE,DELETE等)。任何帮助表示赞赏。

这就是我的尝试,这没有任何意义。

SELECT * FROM categories RIGHT JOIN categories ON subcategory_id = category_id

2 个答案:

答案 0 :(得分:1)

它被称为自我加入。您在查询中包含两次表名,但是给它两个不同的别名,然后它就像一个普通的连接:

SELECT
    C1.category_title AS category_title,
    C2.category_title AS subcategory_of
FROM categories C1
LEFT JOIN categories C2
ON C1.subcategory_id = C2.category_id

答案 1 :(得分:1)

  

据我所知,JOIN是加入两个表,而不是两列

考虑JOIN的更好方法是在列之间定义查询中的关系。

连接的列没有限制在不同的表中。唯一的问题是如何使用别名来引用它们,如前面的答案所述。即使在连接不同的表时,如果对表名使用别名,查询通常也更容易阅读。

当您需要连接具有相同列名的两个(或更多)表时,别名也很有用。