【问题标题】:Trouble with selection query in mysqlmysql中选择查询的问题
【发布时间】:2012-05-08 03:13:17
【问题描述】:

我有一张最难的桌子

    One                        Two
   apple                      orange
   orange                     grapes 
   banana                     strawberry
   orange                     strawberry
   grapes                     apple

现在您可以看到我在这里列出了 5 对。 让我告诉你,这不是一张普通的桌子,因为在这张桌子上水果的名字(苹果)有时在第一列,有时在第二列。

And another table Description
name             color  
apple            red
orange           orange
strawberry       pink
banana           yellow
grapes           black

假设我是香蕉,我不想看到与我配对的水果的描述。 现在有人可以告诉我如何在 mysql 中显示与以下所有内容配对但不与香蕉配对的水果的详细信息:草莓、葡萄、苹果。

我说的是mysql不支持的方法。

Select * from description 
natural join (select one as name where two='apple' union select two as name where one='apple') as t1 
natural join (select one as name where two='grapes' union select two as name where one='grapes') as t2
natural join (select one as name where two='strawberry' union select two as name where one='strawberry') as t3
MINUS
Select * from description 
natural join (select one as name where two='banana' union select two as name where one='banana') as b6

【问题讨论】:

  • 我完全不明白你的问题..?
  • 你不明白什么?
  • @AnkitGautam:您最近对问题的更新增加了要求结果集省略与banana 配对的任何水果,引用MINUS(MySQL 不支持)作为其他解决方案关系型数据库;这个站点上有很多例子,其他例子解释了如何在 MySQL 中实现等效操作:确实,searching Google for "MySQL MINUS" 带来了很多好的结果。您是否尝试过自己实施这些解决方案之一?如果您遇到任何问题,请告诉我们。
  • 我尝试过左连接,但语法让我抓狂,因为在各种站点中左连接是为表提供的,但我使用左连接来连接两个连接

标签: mysql sql


【解决方案1】:

我正在清理我的答案,因为问题正在与原始问题发生变化。

【讨论】:

  • 你明白我的问题了吗
  • 它给出了与苹果、草莓或葡萄中的任何一种配对的所有水果——而不是与所有这些配对的水果(这是您的问题所要求的)。
【解决方案2】:
SELECT * FROM Description
NATURAL JOIN (
  SELECT One AS name FROM hardest WHERE Two = 'strawberry'
  UNION
  SELECT Two AS name FROM hardest WHERE One = 'strawberry'
) AS t1
NATURAL JOIN (
  SELECT One AS name FROM hardest WHERE Two = 'grapes'
  UNION
  SELECT Two AS name FROM hardest WHERE One = 'grapes'
) AS t2
NATURAL JOIN (
  SELECT One AS name FROM hardest WHERE Two = 'apple'
  UNION
  SELECT Two AS name FROM hardest WHERE One = 'apple'
) AS t3;

更新

OP 更新了问题,添加了结果集应排除与banana 配对的任何水果的约束;然后他提出了一个使用WHERE name NOT IN ( SELECT ... ) 的解决方案,但质疑外连接是否会更有效。

首先,使用外连接的查询:

SELECT Description.* FROM Description
NATURAL JOIN (
  SELECT One AS name FROM hardest WHERE Two = 'strawberry'
  UNION
  SELECT Two AS name FROM hardest WHERE One = 'strawberry'
) AS t1
NATURAL JOIN (
  SELECT One AS name FROM hardest WHERE Two = 'grapes'
  UNION
  SELECT Two AS name FROM hardest WHERE One = 'grapes'
) AS t2
NATURAL JOIN (
  SELECT One AS name FROM hardest WHERE Two = 'apple'
  UNION
  SELECT Two AS name FROM hardest WHERE One = 'apple'
) AS t3
NATURAL LEFT JOIN (
  SELECT One AS name, TRUE As hasBanana FROM hardest WHERE Two = 'banana'
  UNION
  SELECT Two AS name, TRUE As hasBanana FROM hardest WHERE One = 'banana'
) AS t4
WHERE hasBanana IS NULL;

关于哪个更有效,this article 比较了不同的方法。它指出(关于[NOT] IN ( SELECT ... )

本质上,这与LEFT JOIN / IS NULL 使用的计划完全相同,尽管这些计划由不同的代码分支执行并且它们在EXPLAIN 的结果中看起来不同。算法其实是一样的,查询是在同一时间完成的。

【讨论】:

  • 你甚至没有考虑表格描述
  • 这会导致一个空集
  • @AnkitGautam:是不是因为我有apples 而不是applesqlfiddle.com/#!2/6bfdf/7 工作正常
【解决方案3】:

您好,您有自己的问题的答案,您必须使用IN 代替=。请检查下面的查询...

select * from hardest,description where 
   (one=name and two IN ('apple' , 'strawberry','grapes')) 
   or 
   (one IN ('apple','strawberry' , 'grapes') and two=name)

谢谢

【讨论】:

    【解决方案4】:

    请确保我的写作方式是最有效的。如果您有其他更有效的方式,请写

     SELECT * FROM Description 
       NATURAL JOIN (   SELECT One AS name FROM hardest WHERE Two = 'strawberry'  
         UNION SELECT Two AS name FROM hardest WHERE One = 'strawberry' ) AS t1
       NATURAL JOIN (   SELECT One AS name FROM hardest WHERE Two = 'grapes'  
         UNION   SELECT Two AS name FROM hardest WHERE One = 'grapes' ) AS t2 
       NATURAL JOIN (   SELECT One AS name FROM hardest WHERE Two = 'apples' 
         UNION   SELECT Two AS name FROM hardest WHERE One = 'apples' ) AS t3
        where name not in ( SELECT One AS name FROM hardest WHERE Two = 'banana' 
         UNION   SELECT Two AS name FROM hardest WHERE One = 'banana') AS fz );
    

    【讨论】:

    • 如果有人能用左连接做到这一点,那么请写
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2014-02-18
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    相关资源
    最近更新 更多