SQLite:如何在不返回重复行的情况下搜索多个列?

时间:2016-08-18 20:51:39

标签: python python-3.x search sqlite

试图通过我对SQL的有限知识来解决这个问题,并且我被困住了。 :)

这是在 SQLite 3 Python 3 中完成的。

我已加入2个表格(名称数据)。

我试图在结果中搜索用户提供的文本中的2列(不区分大小写)。如果在任一列中找到匹配项,则返回该行。

我遇到的问题是,如果在名称列中找到文本,我会返回多行(我猜是因为有多个名称为name的行)。

所需的数据是' name_id '

这是一个加入的模型(还有其他列我没有包含在这里):

<div class="container">
<div class="row">
    <div class="unit col-md-6">
      <div id="blue" class="square col-md-6"></div>
      <div class="text col-md-6">Blue text Lorem Ipsum Blue text Lorem Ipsum Blue text       Lorem Ipsum Blue text Lorem Ipsum Blue text Lorem Ipsum Blue text Lorem Ipsum
      </div>
    </div>

    <div class="unit col-md-6">
      <div id="red" class="square col-md-6"></div>
      <div class="text col-md-6">
      Red Text Lorem Ipsum Red Text Lorem Ipsum Red Text Lorem Ipsum Red Text     Lorem Ipsum Red Text Lorem Ipsum Red Text Lorem Ipsum
      </div>
    </div>
 </div>
 </div>

所以,如果我搜索&#34;牙齿&#34;,我得到:

    -------------------------------------------------------------------
    |  name_id    |     name       |      data_id     |    data       |
    -------------------------------------------------------------------
    |   100       |   John Smith   |        200       |  grey hair    |
    |   100       |   John Smith   |        201       |  hairy teeth  |
    |   101       |  Jerry Jones   |        202       |  white teeth  |
    |   103       | Barry Johnson  |        256       |  brown hair   |
    -------------------------------------------------------------------

并且,如果我搜索&#34; hair&#34;,我得到:

    |   100       |   John Smith   |        201       |  hairy teeth  |
    |   101       |  Jerry Jones   |        202       |  white teeth  |

或者,如果我搜索&#34; john&#34;,我得到:

    |   100       |   John Smith   |        200       |  grey hair    |
    |   100       |   John Smith   |        201       |  hairy teeth  |
    |   103       | Barry Johnson  |        256       |  brown hair   |

但我真正想要的只是根据每个&#39; name_id &#39;返回的一行。这样:

    |   100       |   John Smith   |        200       |  grey hair    |
    |   100       |   John Smith   |        201       |  hairy teeth  |
    |   103       | Barry Johnson  |        256       |  brown hair   |

剩下的SQLite命令如下所示:

    |   100       |   John Smith   |        200       |  grey hair    |
    |   103       | Barry Johnson  |        256       |  brown hair   |

我尝试过使用&#39; DISTINCT&#39;但它似乎根据指定的列删除重复的行。这些缺失的行包含随后未搜索的数据。

感谢。

2 个答案:

答案 0 :(得分:1)

好吧,我假设您只想要name_id列中每个唯一值的第一条记录。如果是这种情况,那么您的查询应如下所示。

SELECT
  *
FROM
  names n
  JOIN data d ON d.name_id = n.name_id
WHERE
  LCASE(n.name) LIKE '%john%' // Force lower so only 1 WHERE statement
GROUP BY
  n.name_id

GROUP BY应该&#39;崩溃&#39;您选择的任何列上的所有数据。因此,假设您想要计算每个name_id的结果数量,您可以更改SELECT语句,如下所示。

SELECT
  n.name_id,
  COUNT(n.name_id) AS result_count
FROM
// Rest of query

如果您不使用像SUM, COUNT, etc这样的聚合函数,那么它只会删除除第一个结果之外的所有函数。

如果这不是你想要的LMK。希望有所帮助。

答案 1 :(得分:0)

使用与前一个答案相同的假设(即您正在寻找唯一名称的第一条记录),我建议如下:

select    names.name_id
          , <names_fields>
          , group_concat(data,';')
from      names
          join  (select name_id, data from data_table)
            on names.name_id = data.name_id
where     name_id
group by  <name_fields>

有关group_concat here的更多信息。