首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我把join搞糊涂了

我把join搞糊涂了
EN

Stack Overflow用户
提问于 2009-12-29 01:46:11
回答 5查看 202关注 0票数 1

我有两张桌子,omc_categories和omc_products。

我想提取omc_proudcts.category_id等于omc_categories.id的类别名称。

我创建了以下sql,但我不确定哪一个是正确的。

代码语言:javascript
复制
SELECT C.Name AS CatName
   FROM omc_categories AS C
   LEFT JOIN omc_products AS P
     ON C.id = P.category_id
   WHERE P.category_id = $category_id
     AND p.status = "active"

代码语言:javascript
复制
SELECT C.Name AS CatName
   FROM omc_products AS P
   LEFT JOIN omc_categories AS C
     ON C.id = P.category_id
   WHERE P.category_id = $category_id
     AND p.status = "active"

谁能告诉我哪一个是对的(如果有的话)以及为什么。我把join和join搞混了。

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS `omc_categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `shortdesc` varchar(255) NOT NULL,
  `longdesc` text NOT NULL,
  `status` enum('active','inactive') NOT NULL,
  `parentid` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=43 ;

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS `omc_products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `shortdesc` varchar(255) NOT NULL,
  `longdesc` text NOT NULL,
  `thumbnail` varchar(255) NOT NULL,
  `image` varchar(255) NOT NULL,
  `class` varchar(255) DEFAULT NULL,
  `grouping` varchar(16) DEFAULT NULL,
  `status` enum('active','inactive') NOT NULL,
  `category_id` int(11) NOT NULL,
  `featured` enum('true','false') NOT NULL,
  `price` float(4,2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=74 ;

-更新--

omc_categories的样本数据

代码语言:javascript
复制
INSERT INTO `omc_categories` (`id`, `name`, `shortdesc`, `longdesc`, `status`, `parentid`) VALUES
(21, 'Front top', 'front top', '', 'active', 4),
(20, 'Galleri 2', 'Galleri 2', '', 'active', 4),
...
(41, 'Trær', '', '', 'active', 27),
(42, 'newfolder', '', '', 'active', 27);

omc_products的样本数据

代码语言:javascript
复制
    INSERT INTO `omc_products` (`id`, `name`, `shortdesc`, `longdesc`, `thumbnail`, `image`, `class`, `grouping`, `status`, `category_id`, `featured`, `price`) VALUES
(1, 'Doggie', 'Cappelen forlag: New Flight', 'Doggie from New flight.', 'images/newflight_doggie_small.jpg', 'images/newflight_doggie_big.jpg', 'new-flight', 'imagebox-new', 'active', 5, 'false', 0.00),
(2, 'Jinnie', 'New flight Jinnie', '', 'images/newflight_jinnie_small.jpg', 'images/newflight_jinnie_big1.jpg', 'new-flight', 'imagebox-new', 'active', 5, 'false', 0.00),
...
...
(73, 'new image', '', '', 'images/daffodil_big.jpg.jpg', 'images/daffodil_big.jpg', '', '', 'active', 42, 'false', 0.00);

例如,最后一行id 73的category_id为42。

我想从omc_categories中取出"newfolder“类别的名称。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-12-29 02:15:23

正如Arthur Thomas指出的,语句的问题是左连接将包括左表中的所有行,当ON子句失败时,使用NULL作为来自右表的列的值。普通(内部)联接将只包括ON子句成功的行。

代码语言:javascript
复制
SELECT DISTINCT C.Name AS CatName
   FROM omc_categories AS C
   JOIN omc_products AS P
     ON C.id = P.category_id
        AND P.category_id = $category_id
   WHERE p.status = "active"

注您可以在ON子句中包含常量表达式,这会减小联接的大小(添加以后删除的行没有意义)。

在构建语句时要小心。你不希望它易受SQL injection攻击。

票数 3
EN

Stack Overflow用户

发布于 2009-12-29 02:13:20

如果您希望提取omc_proudcts.category_id等于omc_categories.id的类别名称,则可以执行以下操作(除非我遗漏了什么……):

代码语言:javascript
复制
SELECT C.Name AS CatName
   FROM omc_categories AS C
   INNER JOIN omc_products AS P
     ON C.id = P.category_id
   WHERE p.status = "active"

INNER JOIN表示连接这两个值相等的表(等同于"WHERE C.id = P.category_id")

票数 2
EN

Stack Overflow用户

发布于 2009-12-29 01:50:14

最有可能的是,你想要这样:

代码语言:javascript
复制
SELECT  name
FROM    omc_categories
WHERE   id IN
        (
        SELECT  category_id
        FROM    products
        WHERE   status = 'active'
        )
        AND id = $id

如果该类别中有活动产品,则返回类别名称,否则不返回任何内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1970620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档