我有三张桌子。 第一。名称:ExTable。列:id(整数),名称(文本)
--------------------
| id | name |
--------------------
| 1 | exA |
| 2 | exB |
| 3 | exC |
--------------------
第二名:名称:CerTable。列:id(整数),名称(文本)
-------------------
| id | name |
-------------------
| 1 | first |
| 2 | second|
| 3 | third |
-------------------
第三名:名称:CerExTable。列:id(整数),来自CerTable的id_cer(整数),id_ex(整数) - 来自ExTable。
----------------------------------
| id | id_cer | id_ex |
----------------------------------
| 1 | 1 (first) |1 (exA)|
| 2 | 1 (first) |2 (exB)|
| 3 | 1 (first) |3 (exC)|
| 3 | 2 (second) |1 (exA)|
| 3 | 2 (second) |3 (exC)|
| 3 | 3 (third) |2 (exB)|
---------------------------------
所以,我想选择id_cer = 2和id_ex!=(不等于!)1和3的数据。所以,我想获得下一个值:exB。如果id_cer = 3,我想得到:exA,exC,如果id_cer = 1,我想得到null。
我的SQL查询:
SELECT ExTable.id, ExTable.name FROM ExTable, CerExTable WHERE CerExTable.id_cer = 2 AND CerExTable.id_ex != ExTable.id
预期结果:
--------------------
| id | name |
--------------------
| 2 | exB |
--------------------
但结果是下一个:
--------------------
| id | name |
--------------------
| 2 | exB |
| 3 | exC |
| 1 | exA |
| 2 | exB |
--------------------
因为此查询首先获取“除exA”之外的数据 - exB,exC,然后“除了C” - exA,exB
如何“一次”获取数据异常而不是两行(例如)?
答案 0 :(得分:0)
如果您更改了选择*
,您将看到您确实在进行更复杂的查询。结果是:
SELECT * FROM ExTable, CerExTable WHERE CerExTable.id_cer = 2 AND CerExTable.id_ex != ExTable.id;
---------------------------------------------------
| ExTable | CerExTable |
---------------------------------------------------
| id | name | id | id_cer | id_ex |
---------------------------------------------------
| 2 | exB | 3 | 2 | 1 |
| 3 | exC | 3 | 2 | 1 |
| 1 | exA | 3 | 2 | 3 |
| 2 | exB | 3 | 2 | 3 |
---------------------------------------------------
所有这些行都满足您要查询的WHERE条件。
获得此结果的解决方案是在同一查询中使用2个选项:
SELECT * FROM ExTable WHERE ExTable.id NOT IN (SELECT CerExTable.id_ex FROM CerExTable WHERE CerExTable.id_cer = 2);