【问题标题】:Left Join ON LIKE needs something like LIMITLeft Join ON LIKE 需要像 LIMIT 这样的东西
【发布时间】:2016-11-29 14:03:01
【问题描述】:

编辑:结尾的LIMIT 无法解决。请仔细阅读。)

我有一个表格,可以通过LEFT JOINLIKE 在另一个表格中查找文本,我想限制结果的数量每左行.

  • usergames AS u 包含代表游戏名称的用户输入字符串的子字符串。
  • games AS g 包含游戏名称的主列表。
  • 1234563列),并且都包含完整的游戏名称(在name 列中)。
  • 如果完整的游戏名称与主列表中的任何内容都不完全匹配(例如,用户错误地输入“Haatline Miami”),我会查看主列表以获取建议,例如任何带有 @ 987654338@或"Miami"

这是我的查询,效果很好:

SELECT u.name,g.name AS suggestion,count(g.name)
FROM usergames u
LEFT JOIN games g
ON CONCAT(' ', g.name, ' ') LIKE CONCAT('% ', u.piece, ' %')
GROUP BY g.name, u.name
ORDER BY u.name ASC, count(g.name) DESC

我的问题是有时建议太多。也许有 1000 款游戏带有“迈阿密”这个词。如何限制“每左行”连接创建的行数?请看下面的数据,一些结果来自“热线”,一些来自“迈阿密”。我怎么能限制每个子字符串的 X 个结果。

样本数据

substrs

games

result

(注意:尾随 LIMIT 不是我想要的,因为我不想限制结果的总数,而只限制由 @ 产生的每个连接项的结果987654345@加入)

(注意:CONCAT 带空格是为了确保只返回完整的单词匹配。如果它们令人困惑,请在心理上删除它们,如果是g.name LIKE s.piece,问题将是相同的)

【问题讨论】:

  • 对于每个单独的配对,你想限制多少?
  • 假设我想限制为 10 个。
  • 您能否添加一些示例数据,清楚地显示您要完成的工作?
  • @TimBiegeleisen 我添加了场景的可视化表示。如果有任何不清楚的地方,请告诉我。

标签: mysql sql


【解决方案1】:

所以,这就是它所需要的:2 个子查询和 2 个与计数表的交叉连接。我仍然不知道如何限制子查询结果的数量,但是这个解决方案使它工作得更快,因为减少的需要大大减少了。 (limit 仍然不适用。)

感谢我的兄弟,我首先了解了使用计数表的 CROSS JOIN。有了这个,我就能想出这个疯狂的解决方案。如果有人在查看我的解决方案后知道更好的方法,请发帖:

SELECT us.name, gs.idGame, suggestion, count(suggestion)
FROM (
    SELECT u.idGame, u.name, SUBSTRING_INDEX(SUBSTRING_INDEX(u.name, ' ', n.n), ' ', -1) AS user_substr
    FROM usergames u
    CROSS JOIN (
        SELECT N FROM _tally
    ) n
    WHERE u.idGame IS NULL
    AND n.n <= 1 + (LENGTH(u.name) - LENGTH(REPLACE(u.name, ' ', '')))
    HAVING LENGTH(user_substr) > 1
) us, 
(
    SELECT idGame, g.name suggestion, SUBSTRING_INDEX(SUBSTRING_INDEX(g.name, ' ', n.n), ' ', -1) AS game_substr
    FROM games g
    CROSS JOIN (
        SELECT N FROM _tally
    ) n
    WHERE n.n <= 1 + (LENGTH(g.name) - LENGTH(REPLACE(g.name, ' ', '')))
    HAVING LENGTH(game_substr) > 1
) gs
WHERE user_substr NOT IN (
    SELECT piece from _piecesrestricted   
)
AND game_substr NOT IN (
    SELECT piece from _piecesrestricted   
)
AND (
    LENGTH(user_substr)>3 OR
    user_substr = suggestion
)
AND user_substr = game_substr
GROUP BY suggestion, us.name
ORDER BY us.name ASC, count(suggestion) DESC

【讨论】:

    【解决方案2】:

    如果你查看文档here,你会看到有一个子句:

    LIMIT <number of records>
    

    除非我误解了你的问题,否则这就是解决方案。

    【讨论】:

    • 这将限制结果总数,但不会限制来自LIKE 的每个单独配对的结果(这可能导致条目数量可变)。我添加了一条注释以指定 LIMIT 不是我所追求的。
    • 我明白了...您只想限制子查询之一...嗯...我不知道这是否可能。直觉上,我会说“不,你不能那样做”,但你最好检查一下我的答案。我可能错了。
    • 谢谢,希望我们能找到
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2011-05-03
    相关资源
    最近更新 更多