SQL查询中的复杂条件

时间:2012-05-27 11:06:52

标签: mysql sql one-to-many one-to-one relationships

我目前正在开展一个涉及多对多和一对多关系的大项目......有几个表可以使用,我无法弄清楚如何做我想要的。 这是我的第一个表(Objects Table):

+-----------+------+-------+
| Object ID | Name | Value |
+-----------+------+-------+   The Object ID is a foreign Key to another table.
|     1     | Aaaa |   2   |   The Name is unique for each Object ID.
|     1     | Bbbb |   5   |
|     2     | Aaaa |   15  |
|     2     | Bbbb |   3   |
+-----------+------+-------+

我的第二个表是以下(用户表):

+---------+------+-------+
| User ID | Name | Value |
+---------+------+-------+    The User ID is also a foreign Key, there are  
|    7    | Aaaa |  10   |    multiple rows with the same User ID. 
|    7    | Bbbb |   7   |
+---------+------+-------+

我有第三张表显示其他表之间的关系

+---------+-----------+
| User ID | Object ID |
+---------+-----------+ There are no identical rows in this table. 
|    7    |     1     |
+---------+-----------+

我正在尝试查找用户拥有的Objects Table中的所有对象。用户需要拥有所有对象名称。对于每个Name,User的值必须至少为该名称的Object值。

例如,在这里,用户的Aaaa值为10,Bbbb的值为7.因此,他拥有对象1的所有名称,并且他的值大于或等于这些值。 因此他可以拥有对象n°1。 对于对象2,用户没有足够的Aaaa,因此他不能拥有对象2。

我知道如何获取用户具有名称的所有对象表行以及具有内部联接的足够大的值:

SELECT Users.User ID, Objects.Object, Objects.Name ID FROM Objects
INNER JOIN Users
ON Objects.Name = Users.Name AND Objects.Value <= Users.Value

但问题是它会返回以下内容:

+---------+-----------+------+
| User ID | Object ID | Name |
+---------+-----------+------+
|    7    |     1     | Aaaa |
|    7    |     1     | Bbbb |
|    7    |     2     | Bbbb |
+---------+-----------+------+

问题是我想摆脱最后一行,因为用户没有足够的Aaaa用于对象2.

任何帮助将不胜感激! 感谢

2 个答案:

答案 0 :(得分:1)

您可以使用not exists子句要求所有匹配对象都不会具有比用户值更高的值:

select  Users.User ID, Objects.Object, Objects.Name ID 
from    Objects o
join    Users u
on      o.Name = u.Name 
where   not exists
        (
        select  *
        from    Objects o2
        where   o2.Name = u.Name
                and o2.Value > u.Value
        )

答案 1 :(得分:0)

您的描述有点混乱,因为您对用户和对象具有相同的“名称”。我假设用户名与对象名不同,并且您想使用映射表。

您应该可以通过加入来执行此操作:

select u.userid, o.objectid, o.name
from UserObjects uo join
     Users u
     on uo.userid = u.userid join
     Objects o
     on uo.objectid = o.objectid
where u.value >= o.value

如果对象表和用户表中的名称真的相同,那么(1)您有一个非规范化的数据库结构,(2)您不需要用户对象表。您可能想问另一个问题,看看我们是否可以为这些表提供更好的数据库结构。

如果你的目标是填充用户对象表,那么查询就更简单了:

选择u.userid,o.objectid,o.name     来自用户你加入          对象o          在u.name = o.name上     其中u.value&gt; = o.value

您可以通过在插入之前使用以下行来创建表:

insert into UserObjects(UserId, ObjectId, Name, Value)