Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何返回仅与特定属性有关的SQL结果?_Sql - Fatal编程技术网

如何返回仅与特定属性有关的SQL结果?

如何返回仅与特定属性有关的SQL结果?,sql,Sql,我有一张类似于以下内容的表格: REL_Aid_To_AttributeValue: ID AttributeValueID 101 1319 101 1320 101 1344 101 1345 102 1319 102 1320 102 1321 102 1336 103 1320 103 1336 SELECT a.ID, a.Title, c.AttributeTypeID, COUNT(b.AttributeValueID)AS Tot

我有一张类似于以下内容的表格:

REL_Aid_To_AttributeValue:
ID    AttributeValueID
101   1319
101   1320
101   1344
101   1345
102   1319
102   1320
102   1321
102   1336
103   1320
103   1336
SELECT a.ID, a.Title, c.AttributeTypeID, 
COUNT(b.AttributeValueID)AS Total
FROM TBL_Aids as a,
REL_Aid_To_AttributeValue as b,
TBL_AttributeValues as c
WHERE a.ID=b.AidID
AND b.AttributeValueID=c.ID
AND a.Status=2
AND AttributeTypeID=1
AND (b.AttributeValueID=1319
OR b.AttributeValueID=1320)
GROUP BY a.ID, a.Title,
c.AttributeTypeID
HAVING COUNT(b.AttributeValueID) <= 2 
我有另一个表,它按类型对这些AttributeValueId进行分组:

TBL_AttributeValues:
AttributeValueID    AttributeTypeID
1319                1
1320                1
1321                1
1336                2
1344                3 
1345                3
我有第三个表,提供了第一个表中每个ID的信息:

TBL_Aids:
ID     Title                Author       etc.
101    Aid About Spiders    John Doe
102    Aid About Mites      Jane Doe 
103    Aid About Beetles    Joe Schmo
我想返回只包含AttributeValueIDs 1319或(包括)1320的ID的结果(以及关于它们的信息,如标题、作者等),在AttributeTypeID=1内。所以我希望返回101,因为它的AttributeType 1只有1319和1320,还有103,因为它的AttributeType 1只有1320。我不想返回102,因为尽管它有1319和1320,但它也有1321,这也是AttributeType 1

我尝试了以下方法:

REL_Aid_To_AttributeValue:
ID    AttributeValueID
101   1319
101   1320
101   1344
101   1345
102   1319
102   1320
102   1321
102   1336
103   1320
103   1336
SELECT a.ID, a.Title, c.AttributeTypeID, 
COUNT(b.AttributeValueID)AS Total
FROM TBL_Aids as a,
REL_Aid_To_AttributeValue as b,
TBL_AttributeValues as c
WHERE a.ID=b.AidID
AND b.AttributeValueID=c.ID
AND a.Status=2
AND AttributeTypeID=1
AND (b.AttributeValueID=1319
OR b.AttributeValueID=1320)
GROUP BY a.ID, a.Title,
c.AttributeTypeID
HAVING COUNT(b.AttributeValueID) <= 2 
选择a.ID、a.Title、c.AttributeTypeID、,
将(b.AttributeValueID)计数为总计
从TBL_Aids作为一个,
将属性值与辅助值关联为b,
TBL_属性值为c
其中a.ID=b.AidID
b.AttributeValueID=c.ID
a.状态=2
和AttributeTypeID=1
和(b.AttributeValueID=1319
或b.AttributeValueID=1320)
按a.ID、a.标题分组,
c、 属性肽
拥有COUNT(b.AttributeValueID)尝试:

尝试:


您想限制您的ID。在where子句中,可以包含以下内容:

where id in (select distinct av.id
             from AttributeValueType avt join
                  AttributeValue av
                   on avt.AttributeValueId = av.AttributeValueId
             where avt.AttributeValueId in (1319, 1320) and avt.AttributeTypeID = 1
            )
如果仅当这两个属性存在时才需要,请尝试以下操作:

Where id in (
    Select av.id
    From AttributeValueType avt join
         AttributeValue av
         on avt.AttributeValueId = av.AttributeValueId
    Group by av.id
    Having max(case when avt.AttributeValueId in (1319, 1320) and avt.AttributeTypeID = 1 then 0 else 1)=0
    Having max(case when 

您想限制您的ID。在where子句中,可以包含以下内容:

where id in (select distinct av.id
             from AttributeValueType avt join
                  AttributeValue av
                   on avt.AttributeValueId = av.AttributeValueId
             where avt.AttributeValueId in (1319, 1320) and avt.AttributeTypeID = 1
            )
如果仅当这两个属性存在时才需要,请尝试以下操作:

Where id in (
    Select av.id
    From AttributeValueType avt join
         AttributeValue av
         on avt.AttributeValueId = av.AttributeValueId
    Group by av.id
    Having max(case when avt.AttributeValueId in (1319, 1320) and avt.AttributeTypeID = 1 then 0 else 1)=0
    Having max(case when 

我认为您需要以某种方式添加“不存在”:

SELECT DISTINCT ID
FROM TBL_Aids x
WHERE AttributeValueID IN
(
    SELECT AttributeValueID
    FROM AttributeValueIDs
    WHERE AttributeValueID IN (1319, 1320) AND AttributeTypeID=1
) AND NOT EXISTS
(
    SELECT *
    FROM AttributeValueIDs a
    WHERE a.AttributeValueID NOT IN (1319, 1320) AND a.AttributeTypeID=1
    AND a.AttributeValueIDs = x.AttributeValueIDs
)

我认为您需要以某种方式添加“不存在”:

SELECT DISTINCT ID
FROM TBL_Aids x
WHERE AttributeValueID IN
(
    SELECT AttributeValueID
    FROM AttributeValueIDs
    WHERE AttributeValueID IN (1319, 1320) AND AttributeTypeID=1
) AND NOT EXISTS
(
    SELECT *
    FROM AttributeValueIDs a
    WHERE a.AttributeValueID NOT IN (1319, 1320) AND a.AttributeTypeID=1
    AND a.AttributeValueIDs = x.AttributeValueIDs
)

您需要两次加入到REL_Aid_to_AttributeValue,以确保存在两行

SELECT a.ID, a.Title, c.AttributeTypeID, 2 AS Total
FROM TBL_Aids a
join REL_Aid_To_AttributeValue b on a.ID=b.AidID and b.AttributeValueID = 1319
join REL_Aid_To_AttributeValue b2 on a.ID=b2.AidID and b2.AttributeValueID = 1320
join TBL_AttributeValues c on b.AttributeValueID=c.ID
WHERE a.Status=2
AND AttributeTypeID=1;
SELECT a.ID, a.Title, c.AttributeTypeID, 2 AS Total
FROM TBL_Aids a
join REL_Aid_To_AttributeValue b on a.ID=b.AidID and b.AttributeValueID = 1319
join REL_Aid_To_AttributeValue b2 on a.ID=b2.AidID and b2.AttributeValueID = 1320
join TBL_AttributeValues c on b.AttributeValueID=c.ID
WHERE a.Status=2
AND AttributeTypeID=1;

另外,如果你知道你有什么值,你就知道有多少,所以这是一个文本
2

,你需要加入两次REL\u Aid\u to\u AttributeValue以确保两行存在

SELECT a.ID, a.Title, c.AttributeTypeID, 2 AS Total
FROM TBL_Aids a
join REL_Aid_To_AttributeValue b on a.ID=b.AidID and b.AttributeValueID = 1319
join REL_Aid_To_AttributeValue b2 on a.ID=b2.AidID and b2.AttributeValueID = 1320
join TBL_AttributeValues c on b.AttributeValueID=c.ID
WHERE a.Status=2
AND AttributeTypeID=1;
SELECT a.ID, a.Title, c.AttributeTypeID, 2 AS Total
FROM TBL_Aids a
join REL_Aid_To_AttributeValue b on a.ID=b.AidID and b.AttributeValueID = 1319
join REL_Aid_To_AttributeValue b2 on a.ID=b2.AidID and b2.AttributeValueID = 1320
join TBL_AttributeValues c on b.AttributeValueID=c.ID
WHERE a.Status=2
AND AttributeTypeID=1;
SELECT  id
FROM    (
        SELECT  DISTINCT id
        FROM    REL_Aid_To_AttributeValue a
        WHERE   attributeValueId IN (1319, 1320)
        ) q
WHERE   NOT EXISTS
        (
        SELECT  id
        FROM    (
                SELECT  AttributeValueID
                FROM    TBL_AttributeValues
                WHERE   AttributeTypeID = 1
                        AND AttributeValueID NOT IN (1319, 1320)
                ) t
        JOIN    REL_Aid_To_AttributeValue a
        ON      a.id = q.id
                AND a.AttributeValueID = t.AttributeValueID
        )

另外,如果你知道你有什么值,你就知道有多少,所以这是一个文本
2

,你需要加入两次REL\u Aid\u to\u AttributeValue以确保两行存在

SELECT a.ID, a.Title, c.AttributeTypeID, 2 AS Total
FROM TBL_Aids a
join REL_Aid_To_AttributeValue b on a.ID=b.AidID and b.AttributeValueID = 1319
join REL_Aid_To_AttributeValue b2 on a.ID=b2.AidID and b2.AttributeValueID = 1320
join TBL_AttributeValues c on b.AttributeValueID=c.ID
WHERE a.Status=2
AND AttributeTypeID=1;
SELECT a.ID, a.Title, c.AttributeTypeID, 2 AS Total
FROM TBL_Aids a
join REL_Aid_To_AttributeValue b on a.ID=b.AidID and b.AttributeValueID = 1319
join REL_Aid_To_AttributeValue b2 on a.ID=b2.AidID and b2.AttributeValueID = 1320
join TBL_AttributeValues c on b.AttributeValueID=c.ID
WHERE a.Status=2
AND AttributeTypeID=1;
SELECT  id
FROM    (
        SELECT  DISTINCT id
        FROM    REL_Aid_To_AttributeValue a
        WHERE   attributeValueId IN (1319, 1320)
        ) q
WHERE   NOT EXISTS
        (
        SELECT  id
        FROM    (
                SELECT  AttributeValueID
                FROM    TBL_AttributeValues
                WHERE   AttributeTypeID = 1
                        AND AttributeValueID NOT IN (1319, 1320)
                ) t
        JOIN    REL_Aid_To_AttributeValue a
        ON      a.id = q.id
                AND a.AttributeValueID = t.AttributeValueID
        )
注意,我已将您的查询转换为更现代的“join”语法。我建议你学一下


还要注意的是,如果您知道自己有哪些值,那么您就知道有多少个值,因此这是一个文本
2
,您需要两次连接到REL\u Aid\u to\u AttributeValue以确保存在两行

SELECT a.ID, a.Title, c.AttributeTypeID, 2 AS Total
FROM TBL_Aids a
join REL_Aid_To_AttributeValue b on a.ID=b.AidID and b.AttributeValueID = 1319
join REL_Aid_To_AttributeValue b2 on a.ID=b2.AidID and b2.AttributeValueID = 1320
join TBL_AttributeValues c on b.AttributeValueID=c.ID
WHERE a.Status=2
AND AttributeTypeID=1;
SELECT a.ID, a.Title, c.AttributeTypeID, 2 AS Total
FROM TBL_Aids a
join REL_Aid_To_AttributeValue b on a.ID=b.AidID and b.AttributeValueID = 1319
join REL_Aid_To_AttributeValue b2 on a.ID=b2.AidID and b2.AttributeValueID = 1320
join TBL_AttributeValues c on b.AttributeValueID=c.ID
WHERE a.Status=2
AND AttributeTypeID=1;
SELECT  id
FROM    (
        SELECT  DISTINCT id
        FROM    REL_Aid_To_AttributeValue a
        WHERE   attributeValueId IN (1319, 1320)
        ) q
WHERE   NOT EXISTS
        (
        SELECT  id
        FROM    (
                SELECT  AttributeValueID
                FROM    TBL_AttributeValues
                WHERE   AttributeTypeID = 1
                        AND AttributeValueID NOT IN (1319, 1320)
                ) t
        JOIN    REL_Aid_To_AttributeValue a
        ON      a.id = q.id
                AND a.AttributeValueID = t.AttributeValueID
        )
注意,我已将您的查询转换为更现代的“join”语法。我建议你学一下

还要注意的是,如果您知道自己有哪些值,那么您就知道有多少个值,因此它是一个文本
2

,这要感谢Quassnoi:

SELECT  id
FROM    (
        SELECT  DISTINCT id
        FROM    REL_Aid_To_AttributeValue a
        WHERE   attributeValueId IN (1319, 1320)
        ) q
WHERE   NOT EXISTS
        (
        SELECT  id
        FROM    (
                SELECT  AttributeValueID
                FROM    TBL_AttributeValues
                WHERE   AttributeTypeID = 1
                        AND AttributeValueID NOT IN (1319, 1320)
                ) t
        JOIN    REL_Aid_To_AttributeValue a
        ON      a.id = q.id
                AND a.AttributeValueID = t.AttributeValueID
        )
    SELECT ID, Title, Author
    FROM TBL_Aids X
    JOIN (
    SELECT AidID
    FROM    (
            SELECT  DISTINCT AidID
            FROM    REL_Aid_To_AttributeValue a
            WHERE   AttributeValueID IN (1319, 1320)
            ) q
    WHERE   NOT EXISTS
            (
            SELECT  AidID
            FROM    (
                    SELECT  ID
                    FROM    TBL_AttributeValues
                    WHERE   AttributeTypeID = 1
                            AND ID NOT IN (1319, 1320)
                    ) t
            JOIN    REL_Aid_To_AttributeValue a
            ON      a.AidID = q.AidID
                    AND a.AttributeValueID = t.ID
            ))
    Y ON X.ID=Y.AidID
    WHERE Status=2
多亏了卡西诺:

    SELECT ID, Title, Author
    FROM TBL_Aids X
    JOIN (
    SELECT AidID
    FROM    (
            SELECT  DISTINCT AidID
            FROM    REL_Aid_To_AttributeValue a
            WHERE   AttributeValueID IN (1319, 1320)
            ) q
    WHERE   NOT EXISTS
            (
            SELECT  AidID
            FROM    (
                    SELECT  ID
                    FROM    TBL_AttributeValues
                    WHERE   AttributeTypeID = 1
                            AND ID NOT IN (1319, 1320)
                    ) t
            JOIN    REL_Aid_To_AttributeValue a
            ON      a.AidID = q.AidID
                    AND a.AttributeValueID = t.ID
            ))
    Y ON X.ID=Y.AidID
    WHERE Status=2

这不太正确,但对我来说似乎有道理。它只返回大约100个结果,但我估计结果集接近700个。而且更重要的是,结果是不准确的。它们既有属性值1319和1320,也有其他属性值。是的,我很少使用join,因为我没有看到它比我使用的方式有什么好处。如果它在这种情况下起作用,我会被说服的!谢谢你的建议。这不太正确,但对我来说似乎有意义。它只返回大约100个结果,但我估计结果集接近700个。而且更重要的是,结果是不准确的。它们既有属性值1319和1320,也有其他属性值。是的,我很少使用join,因为我没有看到它比我使用的方式有什么好处。如果它在这种情况下起作用,我会被说服的!谢谢你的建议。“不存在”似乎是个好主意,但我仍然不知道这将如何工作。AttributeValueID应该从REL_Aid_To_AttributeValue中选择,而AttributeTypeID只在TBL_AttributeValues中。这里不需要其他连接来关联这两个吗?这会起作用,因为它会拒绝AttributeTypeID属于给定类型但AttributeValueID不属于给定列表的行。对不起,我应该更好地解释它。我对上面的问题进行了编辑,以包括我需要从中获取信息的另一个表。AttributeValueID不在TBL_Aids中,AttributeTypeID也不在您所谓的AttributeValueID中(我想您指的是REL_Aid_To_AttributeValue?),没问题。我试图编辑答案以使用正确的表名,但结果对我来说太复杂了。我没弄错,“不存在”似乎是个好主意,但我还是不明白这是怎么回事。AttributeValueID应该从REL_Aid_To_AttributeValue中选择,而AttributeTypeID只在TBL_AttributeValues中。这里不需要其他连接来关联这两个吗?这会起作用,因为它会拒绝AttributeTypeID属于给定类型但AttributeValueID不属于给定列表的行。对不起,我应该更好地解释它。我对上面的问题进行了编辑,以包括我需要从中获取信息的另一个表。AttributeValueID不在TBL_Aids中,AttributeTypeID也不在您所谓的AttributeValueID中(我想您指的是REL_Aid_To_AttributeValue?),没问题。我试图编辑答案以使用正确的表名,但结果对我来说太复杂了。Quassnoi没有弄错。自行运行此子查询将返回除1319和1320(仍然是AttributeValueTypeID=1)之外的其他AttributeValueId的结果。那会发生吗?糟糕透了。这似乎是个好主意,但结果是0。谢谢你再试一次!单独运行此子查询将返回除1319和1320(仍然为AttributeValueTypeID=1)之外的其他AttributeValueId的结果。那会发生吗?糟糕透了。这似乎是个好主意,但结果是0。谢谢你再试一次!对不起,那部分我一定解释得不太清楚。我应该解释第三张表和标签