【问题标题】:SELECT where column1 = column2选择其中 column1 = column2
【发布时间】:2014-04-29 17:43:04
【问题描述】:

在过去的几个小时里,我一直在尝试完成以下任务,但没有任何运气:

$stmt = $db->query( "SELECT league_match_id as match_id, league_match_home_team as home_team, league_match_away_team as away_team FROM $table WHERE (( home_team = away_team ) AND (away_team = home_team))" );

假设我们有 team1 和 team2。在 Team1 在家而 Team2 不在的情况下进行比赛。另一场比赛(行)存储在 team2 在家而 team1 不在的地方。我想用一个查询选择两个团队。

没有球队在比赛,我试图获得 2 行,其中 home_team 和 away_team 的值是镜像的。

谁能帮我走上正轨?

* 更新 *

我得到的回报如下:

Array
(
   [0] => Array
    (
        [t1_id] => 26
        [t1_home] => 2
        [t1_away] => 1
        [t2_id] => 24
        [t2_home] => 1
        [t2_away] => 2
    )

   [1] => Array
    (
        [t1_id] => 28
        [t1_home] => 3
        [t1_away] => 1
        [t2_id] => 25
        [t2_home] => 1
        [t2_away] => 3
    )

   [2] => Array
    (
        [t1_id] => 24
        [t1_home] => 1
        [t1_away] => 2
        [t2_id] => 26
        [t2_home] => 2
        [t2_away] => 1
    )

   [3] => Array
    (
        [t1_id] => 29
        [t1_home] => 3
        [t1_away] => 2
        [t2_id] => 27
        [t2_home] => 2
        [t2_away] => 3
    )

   [4] => Array
    (
        [t1_id] => 25
        [t1_home] => 1
        [t1_away] => 3
        [t2_id] => 28
        [t2_home] => 3
        [t2_away] => 1
    )

   [5] => Array
    (
        [t1_id] => 27
        [t1_home] => 2
        [t1_away] => 3
        [t2_id] => 29
        [t2_home] => 3
        [t2_away] => 2
    )

)

如果 Array[0] 和 Array[2] 相同,它们只是镜像。我可以摆脱这里的重复吗?我希望只有 Array[0] 或 Array[2]。这可能吗?

【问题讨论】:

  • 表中数据的一个小示例,以及您希望从该数据返回的结果集对于解释您想要什么大有帮助。

标签: php mysql sql


【解决方案1】:

我怀疑是否会有“主队”与“客队”相同的行。

听起来好像您想找到 两个 匹配的行。

根据您查询中的条件,听起来您可能想要这样的东西:

SELECT t1.league_match_id         AS t1_match_id
     , t1.league_match_home_team  AS t1_home_team
     , t1.league_match_away_team  AS t1_away_team
     , t2.league_match_id         AS t2_match_id
     , t2.league_match_home_team  AS t2_home_team
     , t2.league_match_away_team  AS t2_away_team
  FROM $table t1
  JOIN $table t2
    ON t1.league_match_home_team = t2.league_match_away_team
   AND t1.league_match_away_team = t2.league_match_home_team

这假设您在表中有相应的行,例如

 id  home   away
 --  -----  ------
  2  bears  tigers
  3  tigers bears

如果有多行具有相同的 (home,away),您将获得多个匹配项。例如,使用:

 id  home   away
 --  -----  ------
  2  bears  tigers
  3  tigers bears
  5  tigers bears
  7  tigers bears
 11  bears  tigers

您将返回总共 12 行。 (id 值为 2 和 11 的行将分别与 id 值为 3、5 和 7 的行“匹配”。)


更新

消除重复取决于重复的来源。添加DISTINCT 关键字将确保结果集中没有两行完全相同,但我怀疑您的重复问题比这更深......bearstigers 彼此面对,家庭和客场,在多场联赛中。

在这种情况下,您需要在表格中添加一些额外的内容,以及一些谓词来限制匹配。这可能是日期,以及一些获取“最新日期”的方法,但这取决于表格中的其他内容。

仅显示列,GROUP BYMAX() 之类的聚合函数可用于为每个“匹配”获取一个不同的行。

例如:

SELECT MAX(t1.league_match_id)    AS t1_match_id
     , t1.league_match_home_team  AS t1_home_team
     , t1.league_match_away_team  AS t1_away_team
     , MAX(t2.league_match_id)    AS t2_match_id
     , t1.league_match_away_team  AS t2_home_team
     , t1.league_match_home_team  AS t2_away_team
  FROM $table t1
  JOIN $table t2
    ON t1.league_match_home_team = t2.league_match_away_team
   AND t1.league_match_away_team = t2.league_match_home_team
 GROUP 
    BY t1.league_match_home_team
     , t1.league_match_away_team

请注意,从 t2 返回 homeaway 是多余的,因为 t1.home = t2.away 等。来自 t1t2 的值是相同的,只是交换了 homeaway .

要限制“反向”行,以便您得到 (bears,tigers) 而不是 (tigers,bears),您可以指定一个额外的谓词,这样您只能得到反向的一个“边”:

AND t1.league_match_home_team < t2.league_match_home_team

跟进

(我的查询中有错字,第一个 JOIN 谓词应该在右侧指定 t2.。我相信 OP 发现了这个问题并修复了它。)

根据最新更新,为了消除结果集中的“镜像”反向行,您可以添加这样的谓词(如果您的查询有一个谓词,则在 GROUP BY 子句之后。)

  HAVING t1_id < t2_id

(与WHERE 子句不同,HAVING 子句可以引用分配给返回列的别名。)

如果您的查询中没有GROUP BY,则使用 WHERE 子句可能会获得更好的性能:

WHERE t1.match_id < t2.match_id

如果您获得两行中的哪一行无关紧要,那么它是小于还是大于比较都无关紧要。您选择比较哪一个 t1 和 t2 列(“id”、“home”或“away”)并不重要,只需要比较 t1 和 t2 之间的列,保证不同(所以你只会得到一面镜子。)

【讨论】:

  • 我喜欢这个查询,它按预期工作,但我得到了重复。我该如何预防?
  • @Kolind:消除重复取决于重复的来源。添加 DISTINCT 关键字将
  • 我已经更新了我的问题。如果你有时间看一看,我会很高兴。再次感谢:)
【解决方案2】:
SELECT 
   t1.league_match_id , 
   t1.league_match_home_team , 
   t1.league_match_away_team ,
   t2.league_match_id , 
   t2.league_match_home_team, 
   t2.league_match_away_team   
FROM 
   {$table} t1 JOIN {$table} t2 ON t1.league_match_home_team=t2.league_match_away_team as away_team  AND 
                                   t2.league_match_home_team=t1.league_match_away_team as away_team
 GROUP BY
   t1.league_match_id , 
   t1.league_match_home_team , 
   t1.league_match_away_team ,
   t2.league_match_id , 
   t2.league_match_home_team, 
   t2.league_match_away_team 

【讨论】:

  • 感谢您的回答。我已经更新了我的问题,因为我想做的事情有些混乱。您编写的查询根本没有为我提供任何行。
  • 它似乎并不像那样工作。 spencer7593 的答案有效,但我有重复。
  • 是的。我将使用 spencer7593 的回答。它工作得很好。非常感谢您的宝贵时间。
  • 嘿@Notulysses...如果你有时间看看我更新的问题,那就太棒了。我有一些新的“问题”:)
猜你喜欢
  • 2021-06-06
  • 2021-01-30
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 2015-01-10
  • 2016-01-20
相关资源
最近更新 更多