gpt4 book ai didi

sql - 我对加入感到困惑

转载 作者:行者123 更新时间:2023-11-29 04:31:18 25 4
gpt4 key购买 nike

我有两个表,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"

谁能告诉我哪一个是正确的(如果有的话)以及为什么。我对加入感到困惑。

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 有 42 个 category_id。

我想从 omc_categories 中提取类别“newfolder”的名称。

最佳答案

正如 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 的攻击.

关于sql - 我对加入感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1970620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com