假设我有这些表:
items
,用于存储商品。
CREATE TABLE items
(
id serial NOT NULL,
name character varying(255),
rarity character varying(255),
created_at timestamp without time zone,
updated_at timestamp without time zone,
CONSTRAINT items_pkey PRIMARY KEY (id)
)
item_modifiers
,它管理项目和修饰符之间的多对多关系
CREATE TABLE item_modifiers
(
id serial NOT NULL,
item_id integer,
modifier_id integer,
primary_value integer,
secondary_value integer,
CONSTRAINT item_modifiers_pkey PRIMARY KEY (id)
)
modifiers
,其中包含所有可能的项目修饰符
CREATE TABLE modifiers
(
id serial NOT NULL,
name character varying(255),
CONSTRAINT explicit_mods_pkey PRIMARY KEY (id)
)
现在假设我有一个复杂的查询。我想查找所有具有ID 1和2的修饰符的项目,按照ID为1的修饰符的primary_value排序。
我试过这个查询
SELECT "items".*, item_modifiers.primary_value FROM "items"
INNER JOIN item_modifiers ON item_modifiers.item_id = items.id
AND ((item_modifiers.modifier_id = 1)
OR (item_modifiers.modifier_id = 2))
GROUP BY items.id, item_modifiers.primary_value
HAVING
COUNT(item_modifiers.id) = 2
ORDER BY item_modifiers.primary_value DESC
但它返回一个空结果集。但是,当我不按primary_value进行分组时,确实如此,但是我无法对它进行排序。我多年来一直坚持这一点,所以非常感谢任何帮助。
编辑我已经建立了一个SQL小提琴来演示 http://sqlfiddle.com/#!15/30887/1
答案 0 :(得分:1)
你不必使用modifier_id 2加入item_modifiers,你只希望它保证这样的记录EXISTS:
SELECT items.*, item_modifiers.primary_value
FROM items
INNER JOIN item_modifiers ON item_modifiers.item_id = items.id AND item_modifiers.modifier_id = 1
WHERE EXISTS
(
SELECT *
FROM item_modifiers
WHERE item_modifiers.item_id = items.id AND item_modifiers.modifier_id = 2
)
ORDER BY item_modifiers.primary_value DESC;
这是你的SQL小提琴:http://sqlfiddle.com/#!15/30887/9
答案 1 :(得分:0)
这就是你要找的东西:
SELECT "items".*,
item_modifiers.primary_value
FROM "items"
INNER JOIN item_modifiers
ON item_modifiers.item_id = items.id
AND ( ( item_modifiers.modifier_id = 1 )
OR ( item_modifiers.modifier_id = 2 ) )
ORDER BY item_modifiers.primary_value DESC;