【问题标题】:I'm not getting the expected result from an SQL query我没有从 SQL 查询中得到预期的结果
【发布时间】:2010-09-08 23:24:28
【问题描述】:

我正在为网站开发搜索功能。我有一个名为关键字的表,其中包含两个字段 id 和关键字。我有两个独立的 AND 和 OR 搜索查询。问题在于 AND 查询。它没有返回我期望的结果。

打印出来的SQL是:

SELECT COUNT(DISTINCT tg_id) 
FROM tg_keywords 
WHERE tg_keyword='keyword_1' 
  AND tg_keyword='keyword_2'

返回的计数为 0,而如果我使用 OR 而不是 AND 执行相同的 SQL,则返回的计数为 1。我预计两种情况下的计数都是 1,我需要它作为 AND 结果将优先于 OR 结果。

任何建议将不胜感激。

谢谢 阿奇

【问题讨论】:

  • 如果str1 != str2,这种情况field=str1 AND field=str2 永远不会发生。因此,您将始终得到 0 个结果。

标签: php sql mysql count


【解决方案1】:

它将始终返回 0,除非关键字_1=关键字_2。 tg_keyword 只能有一个值,当你说 AND 时,你要求两个条件都为真。

从逻辑上讲,这与问“我有多少朋友的名字是'JACK'和'JILL'”是一样的?没有,没有人同时被称为 JACK 和 JILL。

【讨论】:

    【解决方案2】:

    我不知道您的表格是什么样的以及事物之间的关系如何,但是这个查询没有任何意义。您要返回关键字同时是一件事和另一件事的行?这是不可能的。

    您可能有另一个链接到关键字的表?您应该使用连接进行搜索,并搜索这两个关键字。如果您能告诉我们您的桌子是什么样子,我们可以给您更准确的答案。

    编辑:根据您在下面的评论中写的内容(请编辑您的问题!!),您可能正在寻找这个:

    SELECT COUNT(DISTINCT tg_id) 
    FROM tg_keywords AS kw1, tg_keywords AS kw2
    WHERE kw1.tg_id = kw2.tg_id
      AND kw1.tg_keyword='keyword_1'
      AND kw2.tg_keyword='keyword_2'
    

    【讨论】:

      【解决方案3】:

      您的查询无法运行,因为您的条件始终为假,因此不会选择任何记录!

      tg_keyword='keyword_1' AND tg_keyword='keyword_2'
      

      你想做什么?你能把这张表的列贴出来吗?

      【讨论】:

      • 我有一个表,其中包含多个具有相同 ID 的关键字。我怎样才能为同一个 id 比较多个关键字,因为搜索结果需要基于搜索数组中有多少关键字与每个唯一 id 的关键字表中的关键字匹配。有什么想法吗?
      • @archie 请编辑您的问题以包含此说明。
      【解决方案4】:
      tg_keyword='keyword_1' AND tg_keyword='keyword_2'
      

      从逻辑上讲,这永远不可能。不能两者兼而有之。你的意思是这样的:

      SELECT * FROM keywords
      WHERE tg_keyword LIKE '%keyword_1%' OR tg_keyword LIKE '%keyword_2%'
      ORDER BY tg_keyword LIKE '%keyword_1%' + tg_keyword LIKE '%keyword_2%' DESC;
      

      【讨论】:

      • 看起来不错,我现在试试。我会让你知道我是怎么过的。谢谢。
      • 在另一条评论中,他说他的关键字分布在具有相同 ID 的几行中。如果每一行都结合了所有关键字,您的代码就可以工作。
      • 是的,在给出这个答案之前有一条评论(我承认你是在冒险猜测)。
      【解决方案5】:

      根据 OP 的说明:

      我有一个表,其中包含多个具有相同 ID 的关键字。我怎样才能为同一个 id 比较多个关键字,因为搜索结果需要基于搜索数组中有多少关键字与每个唯一 id 的关键字表中的关键字匹配。有什么想法吗?

      我假设您希望返回基于 多少 所选关键字与这些结果匹配的排名的搜索结果?也就是说,多个关键字共享一个潜在搜索结果的ID的ID字段?

      如果是这样,假设您传入了{k1, k2, k3, k4} 形式的关键字数组,您可能会使用这样的查询:

      SELECT ID, COUNT(ID) AS ResultRank FROM tg_keywords WHERE tg_keyword IN (k1, k2, k3, k4) GROUP BY ID ORDER BY ResultRank DESC

      此示例还假设给定关键字可能会以 不同 ID 多次出现在表格中(因为关键字可能适用于多个搜索结果)。该查询将根据 ID 与任何选定关键字一起出现的次数以降序返回一个 ID 列表。在给定的示例中,给定 ID 的最高排名应该是 4,这意味着所有关键字都适用于具有该 ID 的结果...

      【讨论】:

        【解决方案6】:

        我认为您需要将 tg_keywords 加入到自身中。尝试玩弄类似的东西

        select *
        from tg_keywords k1
        join tg_keywords k2 on k1.tg_id = k2.tg_id
        where k1.tg_keyword = 'keyword_1' and k2.tg_keyword = 'keyword_2'
        

        【讨论】:

          【解决方案7】:

          试试:

          SELECT tg_id
          FROM tg_keywords 
          WHERE tg_keyword in ('keyword_1','keyword_2')
          GROUP BY tg_id
          HAVING COUNT(DISTINCT tg_keyword) = 2
          

          【讨论】:

            猜你喜欢
            • 2020-05-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多