【问题标题】:Need help building MySQL SELECT query需要帮助构建 MySQL SELECT 查询
【发布时间】:2012-02-21 12:21:24
【问题描述】:

所以我有一个带有列的表:

deck_id, card_name, quantity, board(irrelevent for this question)

每一行都有我需要的牌组 ID、牌名和上述牌的数量。

看起来像这样:

101, "cardofblahblah", 3, "main"
101, "differentcard", 2, "main"
102, "cardofblahblah", 1, "main"
102, "fictionalcard", 3, "main"
102, "madeupcard", 4, "main"
103, "magicalcard", 2, "main"
103, "trickcard", 3, "main"
...
...

这就是我的数据库的样子。我需要的是一个选择查询,它将返回包含我指定的所有卡片的卡片组的卡片组 ID,例如:我需要一个卡片组,其中包含 1 个“madeupcard”副本和 3 个“cardofblahblah”副本。那是我真正需要做的,但如果有人也提到我可以做 > 或

我知道如何进行查询,但编写这样一个复杂的查询让我很难过。

感谢你们提供的任何帮助。'

编辑: 澄清一下,我正在寻找包含我指定的所有卡片的卡片组的卡片组 ID。例如,“哪些套牌包含 3 份 cardofblahblah 和 1 份 madeupcard?”

我可以得到套牌 ID 的任何类型的输出都是好的。获取牌组 ID 是我最关心的问题。

编辑2: 在浏览了关于 SO 的各种其他主题后,我找到了解决方案。但是,我可能没有最有效的查询,所以如果有人能改进它,那就太好了。

SELECT table1.deck_id, table2.deck_id FROM decklist AS table1 
    JOIN (SELECT * FROM decklist WHERE card_name = "cardofblahblah" AND quantity = 3) 
    AS table2 ON table1.deck_id = table2.deck_id 
    WHERE table1.card_name = "madeupcard" AND quantity = 1;"

编辑3: 感谢 Telarian。他给了我一个更好的查询。

SELECT  t.deck_id
FROM    decklist t
INNER JOIN  decklist l
    ON  l.deck_id = t.deck_id
WHERE   (t.card_name = "madeupcard" AND t.quantity >= 1)
        AND
        (l.card_name = "cardofblahblah" AND l.quantity >= 3)

【问题讨论】:

  • 至少在没有得到任何东西的时候尝试回到这里......
  • 查看sql-match-all 标签,我已将其添加到您的问题中。这类问题已经回答过很多次了。
  • >= 运算符当然可以更改为您可能喜欢的任何其他运算符。不过,这似乎是您想要使用的那个。

标签: mysql sql database sql-match-all


【解决方案1】:

这似乎过于复杂了......

下面的查询不会给你想要的吗?

SELECT  t.deck_id
FROM    decklist t
    INNER JOIN  decklist l
        ON  l.deck_id = t.deck_id
WHERE   (t.card_name = "madeupcard" AND t.quantity >= 1)
        AND
        (l.card_name = "cardofblahblah" AND l.quantity >= 3)

【讨论】:

  • 不,这似乎给了我所有带有“madeupcard”和/或“cardofblahblah”的套牌。我只需要所有的牌组。
  • 比较运算符 ypercube 的好调用。
  • 不,恐怕你错了。它不显示带有“madeupcard”和/或“cardofblahblah”的牌组。它只显示带有“madeupcard”和“cardofblahblah”的套牌。
  • 我应该指出,如果有机会在每副牌中找到不止一次的卡名(我怀疑在这种情况下是这种情况),那么您需要将 DISTINCT 添加到查询中确保您没有多次归还套牌。
  • 对不起,我错了。你是对的,我输入查询时出错了。
【解决方案2】:

试试下面的代码

SELECT *
FROM myTable
WHERE ((board='madeupcard' AND quantity=1) OR (board='cardofblahblah' AND quantity=3))

如果这是你想要的,请告诉我...

【讨论】:

  • 不完全是。我需要包含所有列出的卡片的卡片组的卡片组 ID。您创建的将显示包含其中任何一个的牌组的行,我需要从包含“madeupcard”和“cardofblahblah”的牌组中显示的行。
  • 请相应地更新问题。同时提供您期望的输入和输出...
猜你喜欢
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多