Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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
mysql如何查找交叉引用表中是否至少有一行为null或criteria_Mysql_Sql_Having_Cross Reference_Ifnull - Fatal编程技术网

mysql如何查找交叉引用表中是否至少有一行为null或criteria

mysql如何查找交叉引用表中是否至少有一行为null或criteria,mysql,sql,having,cross-reference,ifnull,Mysql,Sql,Having,Cross Reference,Ifnull,我在mysql上遇到了麻烦,我找不到方法,也许我不知道好的mysql关键字 mysql5 +----------+------------+----------+ | ID | FOREIGNKEY | TRAINER | +----------+------------+----------+ | ... | ... | ... | | 475 | 254 | NULL | | 476 | 254

我在mysql上遇到了麻烦,我找不到方法,也许我不知道好的mysql关键字

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 | | ... | ... | ... | +----------+------------+----------+ 预期结果

约束条件:

我想获取所有的外键id,这些外键id不是全部为NULL或至少有1个空闲,但可以是2个或更多,但至少有一个应该为NULL

+------------+-------+ | ID_TR | FIELD | +------------+-------+ | 405 | .. | +------------+-------+ 我不知道如何在mysql中实现它? 然后一组有一名培训师==免费还是空


感谢您的帮助

这听起来像是EXISTS操作符的经典用例:

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
SELECT *
FROM   mytable a
WHERE  EXISTS (SELECT 1
               FROM   mytable b
               WHERE  a.foreignkey = b.foreignkey 
               AND    trainer IS NOT NULL 
               AND    trainer <> 'FREE'

您可以计算“空闲”和空的数字,然后执行逻辑:

select foreignkey,
       sum(trainer is null) as NumNulls,
       sum(trainer = 'Free') as NumFrees,
       count(*) as Num
from table t
group by foreignkey
然后,您需要添加having子句以获得所需的内容。我不确定这到底意味着什么:我想获得所有的外键id,这些id不是全部为NULL或至少有1个空闲,但可以是2个或更多,但至少有一个应该为NULL

例如,这可能是您想要的:

having NumNulls > 0 and NumFrees > 0
或许是这样:

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

:-我不喜欢看到GROUP BY被这样使用,甚至连BY也不喜欢gurus@Strawberry字体怎么样?你不喜欢吗?MySQL中非聚合列的选择是一项精心设计的功能,它显著提高了性能…@juhnz:从您的示例数据中,我希望在结果中看到ID401、405和406,它们都至少有一条记录,其TRAINER列既不为NULL也不为“FREE”。这不是你想要的吗?我承认这是一种审美上的厌恶——尽管“意义重大”?你确定吗?哦,很抱歉,我的意思是1列既不是空的也不是自由的+1列至少NULLexists看起来不错,但它返回15行,我认为有一个问题在重新查看OP后,我认为我的编辑应该回答这个问题。如果没有,请详细说明为什么这与您需要的输出不同。谢谢对不起,我有28640405,406,我只需要405,因为他有一行为NULL,另一行不同于NULL或frees,我应该至少使用另一行exists吗?我尝试过:从计划请求a中选择不同的id\u tr,其中存在从计划请求b中选择1,其中a.id\u tr=b.id\u tr和trainer不为NULL,trainer“FREE”和exists从中选择1规划请求b,其中a.id\u tr=b.id\u tr和trainer为空,但我得到了286和405,这并不好在修改一点您的请求后,它似乎工作了,但对于有或存在的大表,什么更好?按id从planning_requests t group中选择id_tr,使sumtrainer为NULL>0且sumtrainer为“FREE”且trainer不为NULL>0,然后使用什么设置stackoverflow上SQL代码的格式?@juhnz。如果表上有索引,则可能可以优化exists以获得更好的性能。聚合和have对于描述不同的可能条件更为灵活。好吧,那么我想我将使用exists,因为have看起来会减慢atm的速度。在堆栈溢出上使用什么进行SQL格式化?thx@juhnz . . . 我有自己的SQL编写风格。我自己格式化。
having NumNulls > 0 and NumFrees > 0 and cnt >= 2;