我有两张桌子,omc_categories和omc_products。
我想提取omc_proudcts.category_id等于omc_categories.id的类别名称。
我创建了以下sql,但我不确定哪一个是正确的。
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"或
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搞混了。
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 ;和
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的样本数据
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的样本数据
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“类别的名称。
发布于 2009-12-29 02:15:23
正如Arthur Thomas指出的,语句的问题是左连接将包括左表中的所有行,当ON子句失败时,使用NULL作为来自右表的列的值。普通(内部)联接将只包括ON子句成功的行。
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攻击。
发布于 2009-12-29 02:13:20
如果您希望提取omc_proudcts.category_id等于omc_categories.id的类别名称,则可以执行以下操作(除非我遗漏了什么……):
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")
发布于 2009-12-29 01:50:14
最有可能的是,你想要这样:
SELECT name
FROM omc_categories
WHERE id IN
(
SELECT category_id
FROM products
WHERE status = 'active'
)
AND id = $id如果该类别中有活动产品,则返回类别名称,否则不返回任何内容。
https://stackoverflow.com/questions/1970620
复制相似问题