Mysql SQL查询中的复杂条件

Mysql SQL查询中的复杂条件,mysql,sql,one-to-many,one-to-one,relationships,Mysql,Sql,One To Many,One To One,Relationships,我目前正在从事一个非常大的项目,涉及多对多和一对多的关系。。。有几张桌子要处理,我不知道该怎么做。 这是我的第一个表(对象表): 我的第二个表如下(用户表): 第三个表显示了其他表之间的关系 +---------+-----------+ | User ID | Object ID | +---------+-----------+ There are no identical rows in this table. | 7 | 1 | +---------+---

我目前正在从事一个非常大的项目,涉及多对多和一对多的关系。。。有几张桌子要处理,我不知道该怎么做。 这是我的第一个表(对象表):

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

第三个表显示了其他表之间的关系

+---------+-----------+
| User ID | Object ID |
+---------+-----------+ There are no identical rows in this table. 
|    7    |     1     |
+---------+-----------+
我试图在objects表中找到用户拥有的所有对象。用户需要拥有所有的对象名。对于每个名称,用户的值必须至少是该名称的对象的值

例如,这里,用户的Aaaa值为10,Bbbb值为7。因此,他拥有对象1的所有名称,并且他的值大于或等于这些值。 因此,他可以拥有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
问题是,我想去掉这里的最后一行,因为用户没有足够的Aaaa用于对象2

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

您可以使用
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
        )

您可以使用
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
        )

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

您应该能够通过连接执行此操作:

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 on u.name=o.name 其中u.value>=o.value

可以通过在插入之前具有以下行来创建表:

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

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

您应该能够通过连接执行此操作:

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 on u.name=o.name 其中u.value>=o.value

可以通过在插入之前具有以下行来创建表:

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

我真正想要的是,如果一个对象的值高于用户,那么所有具有相同ID(但名称不同)的对象都被排除在外。在我的示例中,由于用户没有足够的Aaaa用于对象2,因此应该排除ID为2的任何对象。因此,排在第7位;2.Bbbb不应该出现。我不太确定这是否行得通。我想一下。感谢您的回复。我真正想要的是,如果一个对象的值高于用户,那么所有具有相同ID(但名称不同)的对象都将被排除在外。在我的示例中,由于用户没有足够的Aaaa用于对象2,因此应该排除ID为2的任何对象。因此,排在第7位;2.Bbbb不应该出现。我不太确定这是否行得通。我想一下。谢谢你的回答。我想你不明白我的目的。我的目标是填充表示用户和对象之间关系的表。该表将是对另外两个表的查询结果。嘿,伙计们!我终于找到了一个解决方案,我希望没有瑕疵或重大缺陷。我是这样做的:
SELECT Object ID,User ID FROM Users RIGHT JOIN Objects ON Users.Name=Objects.Name AND Users.Value>=Objects.Value按Object ID分组有COUNT(Object.Name)=COUNT(Users.Name)
谢谢您的帮助!我想你不明白我的目的。我的目标是填充表示用户和对象之间关系的表。该表将是对另外两个表的查询结果。嘿,伙计们!我终于找到了一个解决方案,我希望没有瑕疵或重大缺陷。我是这样做的:
SELECT Object ID,User ID FROM Users RIGHT JOIN Objects ON Users.Name=Objects.Name AND Users.Value>=Objects.Value按Object ID分组有COUNT(Object.Name)=COUNT(Users.Name)
谢谢您的帮助!