左连接ON LIKE需要像LIMIT

时间:2016-07-26 04:41:05

标签: mysql sql

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

我有一个表格可以在LEFT JOINLIKE的另一个表格中查找文字,我想限制结果的数量 per-left-row

  • usergames AS u包含表示游戏名称的用户输入字符串的子字符串。
  • 表格games AS g包含游戏名称的主列表。
  • 当用户输入“Hotline Miami”等游戏名称时,输入将被分割,并在substrs中创建2个条目:一个包含"hotline"&一个包含"miami"(在piece列中),并且都包含完整的游戏名称(在name列中)。

  • 如果完整游戏名称与主列表中的任何内容完全不匹配(例如用户错误地输入“Haatline Miami”),我会检查主列表中的建议,例如任何带{的游戏{1}}或"Haatline"

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

"Miami"

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

示例数据

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

enter image description here

substrs

enter image description here

games

enter image description here

(注意:尾随result不是我要找的,因为我不想限制结果的总数,而只限制结果的每个加入项的结果LIMIT加入)

(注意:LIKE w / space用于确保只返回完整的单词匹配。如果它们混淆,请在心理上删除它们,如果是{{1则问题将是相同的}})

2 个答案:

答案 0 :(得分:0)

如果查看文档here,您会看到有一个条款:

LIMIT <number of records>

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

答案 1 :(得分:0)

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

首先,由于我的兄弟,我通过计数表了解了CROSS JOINs。有了这个,我就能想出这个疯狂的解决方案。如果在查看我的解决方案之后有人知道更好的方法,请发帖:

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