SQL对复杂查询进行排序

时间:2014-02-20 07:52:00

标签: sql postgresql

假设我有这些表:

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

2 个答案:

答案 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;