【问题标题】:Selecting Rows Where Conditions Match A Single Row?选择条件匹配单行的行?
【发布时间】:2012-09-19 03:15:20
【问题描述】:

我有两个通过外键连接的表。在表 A 中,我试图获取时间列中的数据大于或等于表 B 开始列以及时间列中的数据小于或等于表 b 结束列的所有行。我在想内部连接可能适用于此,但是,结果不是我所期望的。它正在返回一些数据,但它们正在重复自己。

这是我所拥有的:

SELECT * FROM columnA
INNER JOIN columnB
ON columnA.time >= columnB.start
OR columnA.time <= columnB.stop

我看错了吗?内连接是收集这些数据的正确方法吗?

更新:

实际上tableA的外键是连接到tableB的主键。反正我是这样做的:

SELECT * FROM tableA
INNER JOIN tableB
ON tableA.time >= tableB.start
AND tableA.time <= tableB.stop

我没有做你为 on 做的事情的原因是因为数据已经在数据库中几年了,而我最近刚刚添加了带有外键的列。所以该列还没有任何数据。这就是我查询它的原因,这样我就可以知道要使用信息更新哪些列。它把数据返回给我,但也返回了其他不符合要求的数据。

【问题讨论】:

  • 您是说使用 AND 有帮助还是没有帮助?如果没有帮助,您能否发布一些示例数据来说明问题所在以及您想要/期望的结果?
  • 它有帮助,实际上现在我想起来我的问题是错误的。 tableB 的第一行有一个开始和停止时间。我要做的是选择tableA中大于或等于第一行开始时间且小于或等于同一行停止时间的数据。抱歉,没有意识到我的问题是如何措辞的。

标签: mysql sql foreign-keys inner-join


【解决方案1】:

您需要使用外键进行连接,然后过滤掉与您的条件不匹配的结果。

Select * from TableA
Inner join TableB on TableA.Key = TableB.Key
Where TableA.time >= TableB.Start
Or TableA.time <= TableB.Stop

通常,我总是将 W3Schools 的 sql 页面放在手边。这是我可能忘记并需要快速复习的 SQL 函数的最佳快速参考。也是一个学习的好地方。

【讨论】:

  • @JohnWoo 我必须指出,该链接中的勘误表均未涉及 w3schools SQL 内容...
  • 我无法与他们的任何其他教程交谈,但我确实记得他们的一些 SQL 内容中存在一些不准确之处。然而,那是极少数,如果你保持头脑清醒,让 F1 钥匙成为你最好的朋友之一,它的利大于弊。
【解决方案2】:

您必须使用定义它们关系的 columnName 加入它们,并将条件放在WHERE 子句中。 (不在ON 子句中

SELECT a.*, b.*
FROM    tableA a
        INNER JOIN tableB b
            ON a.colName = b.colName  -- colName is the column that links 
WHERE   a.`time` >= b.`start` OR      -- both tables.
        a.`time` <= b.`stop`

【讨论】:

  • 没有要求将时间条件移动到where子句。问题是OR
【解决方案3】:
SELECT a.* 
FROM columnA a 
INNER JOIN columnB b ON a.joiningColumn = b.joiningColumn
WHERE a.time >= b.start
OR a.time <= b.stop

【讨论】:

    【解决方案4】:

    从你的问题...

    where the data in the time column is greater than or equal to the table B start column  
      AND  
    where the data in the time column is less than or equal to the table b end column
    

    但您的查询...

    columnA.time >= columnB.start  
      OR  
    columnA.time <= columnB.stop  
    

    结合别人的笔记,关于使用外键加入...

    SELECT
      *
    FROM
      TableA
    INNER JOIN
      TableB
        ON  TableA.PK    = TableB.FK
        AND TableA.time >= TableB.start
        AND TableA.time <= TableB.stop 
    

    【讨论】:

      【解决方案5】:

      我设法通过添加一个 WHERE 来匹配我正在寻找的确切行中的数据来找出解决方案。这是我的解决方案:

      SELECT * FROM tableA
      INNER JOIN tableB
      ON tableA.timetag >= tableB.start
      AND tableA.timetag <= tableB.stop
      WHERE tableB.id = "1"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-28
        • 2011-04-20
        • 2021-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        相关资源
        最近更新 更多