首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >命令复杂查询的SQL

命令复杂查询的SQL
EN

Stack Overflow用户
提问于 2014-02-20 07:51:59
回答 2查看 167关注 0票数 1

假设我有这些桌子:

items,它存储项目。

代码语言:javascript
复制
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,它管理项和修饰符之间的多到多关系。

代码语言:javascript
复制
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,它包含所有可能的项修饰符。

代码语言:javascript
复制
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排序的。

我尝试过这个查询

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-20 08:46:16

您不需要使用item_modifiers 2加入modifier_id,您只需要确保存在这样的记录:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-02-20 08:32:08

这就是你要找的吗?

代码语言:javascript
复制
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; 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21901473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档