mysql how to find if at least one row from cross reference table is null or criteria

冷暖自知 提交于 2019-12-13 08:29:21

问题


i have trouble with mysql, i dont find the way to do it maybe i dont know the good mysql keyword

mysql5

+----------+------------+----------+
| ID       | FOREIGNKEY |  TRAINER |
+----------+------------+----------+
|      ... | ...        | ...      |
|      475 | 254        |  NULL    |
|      476 | 254        |  NULL    |
|      477 | 254        |  NULL    |
|      478 | 286        |  NULL    |
|      479 | 286        |  FREE    |
|      480 | 286        |  FREE    |
|      481 | 401        |  FREE    |
|      482 | 401        |  1       |
|      483 | 401        |  FREE    |
|      484 | 405        |  NULL   |
|      485 | 405        |  1       |
|      486 | 405        |  5       |
|      487 | 405        |  FREE    |
|      488 | 406        |  1       |
|      489 | 406        |  5       |
|      490 | 406        |  5       |
|      491 | 406        |  2       |
|      ... | ...        |  ...     |
+----------+------------+----------+

Expected result

Constraint :

i would like to get all the foreignkey id that have not all trainer NULL or FREE (at least 1 but can be 2 or more) but at least one should be NULL

+------------+-------+
|    ID_TR   | FIELD |
+------------+-------+
|      405   |   ..  |
+------------+-------+

i dont know how to do it in mysql ? Group then HAVING one trainer == FREE OR NULL ?

thanks for helping me


回答1:


This sounds like a classic usecase for the EXISTS operator:

SELECT *
FROM   mytable a
WHERE  EXISTS (SELECT 1
               FROM   mytable b
               WHERE  a.foreignkey = b.foreignkey 
               AND    trainer IS NOT NULL 
               AND    trainer <> 'FREE'

EDIT:
If you just just want the distinct different foreignkeys:

SELECT DISTINCT foreignkey
FROM   mytable a
WHERE  EXISTS (SELECT 1
               FROM   mytable b
               WHERE  a.foreignkey = b.foreignkey 
               AND    trainer IS NOT NULL 
               AND    trainer <> 'FREE'



回答2:


SELECT   t.*
FROM     my_table    t
    JOIN cross_table x ON x.FOREIGNKEY = t.ID_TR
WHERE    x.TRAINER IS NOT NULL
     AND x.TRAINER <> 'FREE'
GROUP BY t.ID_TR



回答3:


You can count the number that are 'FREE' and NULL and then do logic:

select foreignkey,
       sum(trainer is null) as NumNulls,
       sum(trainer = 'Free') as NumFrees,
       count(*) as Num
from table t
group by foreignkey

You then want to add a having clause to get what you want. I am not sure exactly what this means: "i would like to get all the foreignkey id that have not all trainer NULL or FREE (at least 1 but can be 2 or more) but at least one should be NULL".

For instance, this might be what you want:

having NumNulls > 0 and NumFrees > 0

or perhaps this:

having NumNulls > 0 and NumFrees > 0 and cnt >= 2;


来源:https://stackoverflow.com/questions/21363523/mysql-how-to-find-if-at-least-one-row-from-cross-reference-table-is-null-or-crit

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!