SQL加入精确结果

时间:2015-07-10 07:56:00

标签: mysql sql join group-by

我的数据库中有以下表格。它的目的是保持颜色集。即[红色+黑色],[蓝色+绿色+黄色]等

CREATE TABLE `df_productcolours` 
(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_colourSet` int(11) NOT NULL,
  `id_colour` int(11) NOT NULL,

  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQUE` (`id_colourSet`,`id_colour`),
  KEY `idx_colourSet` (`id_colourSet`),
  KEY `idx_colour_id` (`id_colour`),
  CONSTRAINT `fk_colourid` FOREIGN KEY (`id_colour`) REFERENCES `df_lu_color` (`id`) 
  ON DELETE NO ACTION ON UPDATE NO ACTION
) 

我创建了一个存储过程,它将一个id_colour整数数组作为输入,并返回一个颜色集id。它的意思是返回包含这些颜色的集合,并且只返回那些作为输入提供的颜色。它实际上做的是返回包含所请求颜色和其他颜色的集合。

这是我到目前为止的代码:

SET @count = (SELECT COUNT(*) FROM tempTable_inputColours);

SELECT A.id_colourSet
FROM df_productcolours AS A
INNER JOIN tempTable_inputColours AS B
    ON A.id_colour = B.id_colour
GROUP BY A.id_colourSet
HAVING COUNT(A.id_colour) = @count
    AND COUNT(B.id_colour) = @count;

我觉得问题可能与我加入的方式有关,但我似乎无法得到它。任何帮助,将不胜感激。感谢。

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

SELECT A.id_colourSet
FROM df_productcolours AS A
INNER JOIN tempTable_inputColours AS B
ON A.id_colour = B.id_colour
WHERE A.id_colourSet IN (SELECT id_colour FROM tempTable_inputColours)
AND A.id_colour IN (SELECT id_colour FROM tempTable_inputColours)

修改

SELECT A.id_colourSet
FROM df_productcolours AS A
INNER JOIN tempTable_inputColours AS B
ON A.id_colour = B.id_colour
WHERE A.id_colourSet =(SELECT SUM(id_colour) FROM tempTable_inputColours)

答案 1 :(得分:0)

我想我经过几天的惩罚后自己解决了。这是代码:

SET clrCount = (SELECT COUNT(*) FROM _tmp_ColourSet);

-- The first half of the query does an inner join, 
-- it will return all sets that have ANY of our requested colours. 
-- But the HAVING condition will make it return sets that have AT LEAST all of the colours we are requesting.
-- So at this point we have all the super-sets, if you will.
-- Then, the second half of the query will restrict that further, 
-- to only sets that have the same number of colours as we are requesting.
-- And voila :)

                      -- FIND ALL COLOUR SETS THAT HAVE ALL REQUESTED COLOURS
    SET colourSetId = (SELECT A.id_colourSet 
                        FROM df_productcolours AS A
                        INNER JOIN _tmp_colourset AS B
                            ON A.id_colour = B.id_colour
                        GROUP BY A.id_colourSet
                        HAVING COUNT(A.id_colour) = clrCount
                        -- FIND ALL COLOUR SETS THAT HAVE EXACTLY N COLOURS
                        AND A.id_colourSet IN (SELECT A.id_colourSet
                                                FROM df_productcolours AS A
                                                GROUP BY A.id_colourSet
                                                HAVING COUNT(A.id_colour) = clrCount));

希望能帮助别人拉头发。