Mysql SQL查询,其中所有A必须具有来自B的以下相等列?
这里是我的具体例子,我的意思。我定义了下表:Mysql SQL查询,其中所有A必须具有来自B的以下相等列?,mysql,sql,logic,subquery,relational-division,Mysql,Sql,Logic,Subquery,Relational Division,这里是我的具体例子,我的意思。我定义了下表: CREATE TABLE pets ( id INTEGER UNSIGNED NOT NULL, name VARCHAR(20) NOT NULL, breed VARCHAR(20) NOT NULL, color VARCHAR(20) NOT NULL, weight INTEGER UNSIGNED NOT NULL, PRIMARY KEY (id) ); 我将如何编写SQL查询来查找包
CREATE TABLE pets (
id INTEGER UNSIGNED NOT NULL,
name VARCHAR(20) NOT NULL,
breed VARCHAR(20) NOT NULL,
color VARCHAR(20) NOT NULL,
weight INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (id)
);
我将如何编写SQL查询来查找包含与可卡犬颜色相同的宠物的品种?因此,如果数据库中的所有可卡犬都是黑色或白色的,我需要找到至少有一只黑色宠物和一只黄色宠物的所有不同品种。我已经被这个问题难住了一段时间,在网上找不到可比的答案,所以这里的任何帮助都将不胜感激。如果我理解正确的话,你不会想要全白或全黑的品种。你只想要白色和黑色的品种——不同颜色的可卡犬。基于这一点,我得出了以下结论,尽管它可能不是最有效的
SELECT DISTINCT breeds FROM pets
WHERE color in (SELECT color FROM pets where name='cocker spaniels')
DECLARE @pets TABLE(
id INTEGER NOT NULL,
name VARCHAR(20) NOT NULL,
breed VARCHAR(20) NOT NULL,
color VARCHAR(20) NOT NULL,
weight INTEGER NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO @pets VALUES (1, 'jeff', 'breed1', 'black', 20)
INSERT INTO @pets VALUES (2, 'larry', 'breed1', 'white', 20)
INSERT INTO @pets VALUES (3, 'bob', 'breed2', 'black', 30)
INSERT INTO @pets VALUES (4, 'kevin', 'breed3', 'black', 30)
INSERT INTO @pets VALUES (5, 'jerry', 'breed3', 'white', 30)
DECLARE @breed VARCHAR(50)
SET @breed = 'breed1'
;WITH cte (color) AS (SELECT DISTINCT color FROM @pets WHERE breed = @breed)
SELECT breed, COUNT(id) FROM @pets WHERE color IN (SELECT color FROM cte)
AND breed != @breed
GROUP BY breed
HAVING COUNT(id) >= (SELECT COUNT(*) FROM cte)
Result: breed3
如果您使用的SQL版本不支持CTE,那么可以使用temp表格或表格变量来保存您需要在其他品种中查找的颜色。希望这有帮助 一如既往,对实际的RDBMS保密会让事情变得更加困难 对于支持CTE PostgreSQL、Oracle、SQL Server的数据库。。 CTEs: 解释 以CTE颜色获得一组不同颜色的可卡犬。 加入所有颜色相同的宠物,按品种分组 在HAVING子句中,验证不同颜色的数量是否与可卡犬的颜色数量相匹配。 因此,包括可卡猎犬在内的宠物都有可卡猎犬所拥有的所有颜色,甚至可能更多 这是关系划分的一个特例。我们最近收集了大量的查询 对于MySQL
如何给出一些示例数据和输出示例?黄色是新的白色?哎呀,我忘了指定我使用的是MySQL,它不支持:/CTEs,我怎么做?@A_Obregon:我添加了MySQL的版本。
WITH colors AS (
SELECT DISTINCT color
FROM pets
WHERE breed = 'cocker spaniels'
)
SELECT p.breed
FROM colors c
JOIN pets p USING (color)
GROUP BY p.breed
HAVING count(DISTINCT p.color) = (SELECT count(*) FROM color);
SELECT p.breed
FROM (
SELECT DISTINCT color
FROM pets
WHERE breed = 'cocker spaniels'
) c
JOIN pets p USING (color)
GROUP BY p.breed
HAVING count(DISTINCT p.color) = (
SELECT count(DISTINCT color)
FROM pets
WHERE breed = 'cocker spaniels'
);
--parameter
DECLARE @breed varchar(20)
SET @breed = 'Cocker Spaniel'
--count distinct colors for param
DECLARE @colors int
SELECT @colors = COUNT(DISTINCT color) FROM pets WHERE breed = @breed
--match param breed with others based on color
--return only breed with matching count of distinct colors
SELECT otherBreeds.breed
FROM
(SELECT DISTINCT breed, color FROM pets WHERE breed = @breed) AS thisBreed
LEFT OUTER JOIN (SELECT DISTINCT breed, color FROM pets WHERE breed <> @breed) AS otherBreeds
ON thisBreed.color = otherBreeds.color
GROUP BY otherBreeds.breed
HAVING COUNT(DISTINCT otherBreeds.color) = @colors