我的脚本使用的是PHP,我使用jQuery自动完成功能在webform上注册事件。 jQuery在var request = await _context.Request
.Include(r => r.Emails)
.ThenInclude(e => e.Tokens)
.SingleOrDefaultAsync(r => r.Id == id);
文本字段上工作,并在选择名称后完成所有其他文本字段。
但是,我的数据库存储过去事件的所有记录。例如,Susan Boyle参加了我之前的5场比赛,当我输入name
时,name
文本字段将显示5位Susan Boyle。如何过滤掉相同的名称?
我的jQuery代码:
Susan
更新:抱歉,我忘记了SQL代码,我在另一个php文件中编写了SQL。 (SQL代码adjax_reg.php)
$('input.item-autocomplete').on('autocompleteselect', function (e, ui) {
$.ajax({
url:"ajax_reg.php",
dataType:"json",
data:{
'name' : ui.item.value,
'action' : 'get_fulldata'
},
success:function(data){
$("#mobile1").val(data.mobile1);
$("#mobile2").val(data.mobile2);
$("#email").val(data.rt_email);
$("#tf1").val(data.tf1);
$("#tf2").val(data.tf2);
$("#tf3").val(data.tf3);
}
});
});
答案 0 :(得分:1)
您需要获得users
至少参加活动的标准。您可能正在users
加入events
,但您需要根据users
过滤participation
。假设您使用下表:
用户(id,mobile1,mobile2,email,tf1,tf2,tf3)
事件(id,name)
参与(id,user_id,event_id)
你需要这样的查询:
select id, mobile1, mobile2, email, tf1, tf2, tf3
from users
where exists (select 1
from participations
where users.id = participation.user_id)
and users.name like '%Susan%'
这将为每个用户返回一条记录,其中包含参与至少一个事件的搜索文本,为您提供所需的列。
修改
我看过你编辑过的问题,还有很多问题需要解决。
问题:
在select子句中使用列列表以确保只选择所需内容:
select mobile1, mobile2, rt_contact, tf1, tf2, tf3, rt_ic ...
将解决此问题。
您必须使用distinct关键字
select distinct mobile1, mobile2, rt_contact, tf1, tf2, tf3, rt_ic ...
这将选择distinct
值,但如果您有不一致的地方,即同一个人的同名姓名不同,那么您将返回多条记录。
如果您想要LIKE
%...%
包含您已通过的文字的用户,则必须使用if
和select
,如同name
一样。此外,如果select
不唯一,name
id
以及name
也可能不会受到影响。
这很容易SQL Injection,黑客很容易对数据库造成伤害甚至加载他们没有资格加载的数据。使用参数化查询与PDO,或转义参数。
如果将处理数据库的部分与引擎部分和视图部分分开,则代码更易于维护。
不在normal form的数据库很少运行良好,很难维护,很容易出现redundancy和inconsistency,而且它们通常效果不佳。
答案 1 :(得分:0)
在PHP脚本中,您只需通过添加GROUP BY
子句来调整SQL查询。
我没有看到你的查询,但是这样的话:
SELECT * FROM events
JOIN artists ON events.artist_id = artists.id
WHERE artist like :searchterm
GROUP BY artists.artist_name