试图通过我对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;但它似乎根据指定的列删除重复的行。这些缺失的行包含随后未搜索的数据。
感谢。
答案 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的更多信息。