【问题标题】:How do I select one row based on similar or opposing data in other rows?如何根据其他行中相似或相反的数据选择一行?
【发布时间】:2012-02-13 21:15:55
【问题描述】:
id    player_id nat nt_caps
13740   28664   97  24  
13741   28664   68  0   
13742   28664   79  0   
16252   42904   15  40  
16253   42904   68  0   
16254   42904   241 0   

这就是我的桌子的样子。我想为每个 nat 选择具有 nt_caps = "0" 的 player_id 或仅对于 nat = "68" 具有 nt_caps != "0" 的 player_id。

我尝试使用的 SQL 查询是:

SELECT player_id FROM x WHERE nat = '68' AND (nat != '68' AND nt_caps = '0')

但后来我得到 player_id '42904' 和 '28664' 因为它们都有 1 个与查询匹配的条目,但我不想要它们,因为它们有 nt_caps 用于另一个 nat 而不是 nat "68"。

我希望你能理解我想要达到的目标。

【问题讨论】:

  • 如果你想要这个或那个,你为什么要使用 AND?
  • 对我来说这听起来很混乱。但据我所知,将第一个 AND 更改为 OR,您的查询应该返回 ok。
  • nt_caps中是否有NULL值?
  • 请举一个输入和期望输出的例子,我明白你想要什么,但似乎很多人没有。
  • 我输入了 nat = 68,然后我想要所有 nat 的 nt_caps = 0 的所有 player_id,除了 nat = 68 或所有 nt_caps = 0 的 player_id。如果他们有除 nt = 68 以外的任何 nt_caps,我想排除它们。上表只是一个例子,有超过 40k 行。

标签: php mysql select


【解决方案1】:
SELECT * FROM x WHERE nt_caps = 0 OR (nt_caps != 0 AND nat = 68)

【讨论】:

  • 你误解了这个问题。他希望玩家的所有 nats 都为 0(同一玩家有多个记录)
  • 问题是我的记录比显示的记录多,其中 nt_caps = 0 但它们的 nat != 68 然后我不想要它们(我通过该查询得到它们)。跨度>
  • 那你为什么不添加一个GROUP BY player_id
【解决方案2】:

第一个子查询获取所有 nt_caps 都等于 0 的行,第二个子查询返回其他行:

(SELECT x1.player_id
FROM x x1
LEFT JOIN x x2
  ON x2.player_id = x1.player_id
  AND x2.nt_caps <> 0
WHERE x1.nt_caps = 0
  AND x2.id IS NULL)
UNION
(SELECT x1.player_id
FROM x x1
LEFT JOIN x x2
  ON x2.player_id = x1.player_id
  AND x2.nt_caps <> 0
  AND x2.nat <> x1.nat
WHERE x1.nat = 68
  AND x1.nt_caps <> 0 // Exclude this line if nt_caps "can be" !=0 instead of "must be"
  AND x2.id IS NULL)

【讨论】:

  • 好评。这就是我会做的。保持美观和简单,无需迭代。
猜你喜欢
  • 1970-01-01
  • 2011-03-27
  • 2018-03-16
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2021-07-15
相关资源
最近更新 更多