我有一个MYSQL数据库,用于在电视节目中存储有关访客的数据。需要应用以下命令:
MySqlCommand cmd = new MySqlCommand(
@"select
guest.name,
guest.occupation,
guest.pv,
guest.phone,
guest.mobile,
guest.email,
program.name,
episode.date,
episode.time
from
guest,
program,
host,
episode
where guest.name=episode.guestnamefk
AND host.name=episode.hostnamefk
AND program.name=episode.programnamefk
AND guest.name Like '%" + searchnamebox.Text + "%' ", conn);
我有两种搜索方式,第一种是快速搜索,它采用用户编写的内容并按照以下方式搜索:
string syn =
@"select
name,
pv,
country,
occupation ,
type ,
phone,
mobile ,
email
from
guest
where
name like '%" + textBox1.Text + "%'
OR pv like '%" + textBox1.Text + "%'
OR phone like '%" + textBox1.Text + "%'
OR mobile like '%" + textBox1.Text + "%'
OR email like '%" + textBox1.Text + "%'
OR country like '%" + textBox1.Text + "%'
OR type like '%" + textBox1.Text + "%'
OR occupation like '%" + textBox1.Text + "%' ";
当我应用第二个查询时,我得到了正确的结果,但是当我应用第一个查询时,我只得到第一个名字。我相信在我的数据库中链接表有问题,但使用字符串链接是否有问题,因为使用id现在不适合我的程序?
答案 0 :(得分:1)
这可能是与数据相关的问题,但如果没有用于执行查询或示例数据的代码,则无法确定。这个答案只是一个有根据的猜测。
第一个查询在4个表guest
,program
,host
和episode
之间执行内部联接。它相当于使用INNER JOIN的以下语法,实际上,现在考虑不推荐使用原始连接格式:
from
guest
inner join episode on guest.name=episode.guestnamefk
inner join host on host.name=episode.hostnamefk,
inner join program on program.name=episode.programnamefk
where
guest.name Like '%someFragment%';
只有当所有条件匹配时,如果有名称中包含someFragment
的客户 ON ,此查询才会返回结果,即guestnamefk
与{name
完全相同1}},hostnamefk
完全等于host
等。如果甚至有一个字符不同,即使是开头或结尾的空格,匹配也会失败。通常情况下,匹配不会考虑字母大小写,John
匹配JOHN
,但不会John
。
使用名称或任何具有商业意义的信息作为关键是一个坏主意。如果name
为John
,guestnamefk
必须也为John
。如果重命名了第一个名称,则更改必须级联到所有相关记录。
出于这个原因,代理键几乎总是用作主键,例如名为GuestId
的整数字段。这允许您仅更改来宾表中的来宾名称,而不必影响其他任何内容。
如果您想要在没有匹配剧集,主持人或节目的情况下检索访客,您需要使用LEFT JOIN
,它会返回左侧的所有记录以及右侧的任何匹配记录,如果右侧没有匹配则返回NULL。使用LEFT JOIN
是调试失败的INNER JOIN查询的一种非常好的方法。
from
guest
left outer join episode on guest.name=episode.guestnamefk
left outer host on host.name=episode.hostnamefk,
left outer program on program.name=episode.programnamefk
where
guest.name Like '%someFragment%';
如果所有表中只有一个匹配记录,则只返回一条记录。
您可以尝试使用FULL OUTER JOIN检查所有不匹配。对于左侧和右侧的非匹配记录,这将返回null。这将揭示,例如guestnamefk
是否同时包含John
和John
条目。以下查询将仅返回某些缺少链接的记录:
from
guest
full outer join episode on guest.name=episode.guestnamefk
full outer host on host.name=episode.hostnamefk,
full outer program on program.name=episode.programnamefk
where
guest.name is null
or episode.guestnamefk is null
or program.name is null
or host.name is null;
另一种可能性是查询执行不正确。例如,如果使用ExecuteReader()
,则可能会丢失对Read()
的调用。丢失的大括号可能导致执行跳过Read
的调用。调用break,
继续or
return`可能会提前终止循环。再说一次,如果不看代码,就无法猜测。