具有类似列信息的MySQL表 - 帮助!

时间:2010-06-05 15:44:45

标签: php mysql

我有一个名为“victim”的表的数据库。将信息转储到表中的表单有两个受害者的空间,因此有vic1_fname,vic1_lname,vic2_fname,vic2_lname等。(业务名称,人员优先,人员姓名,地址,城市,州,邮编)“1 “和”2“各自。现在我想搜索数据库并查找列出的受害者。

这是我到目前为止所做的:

$result = mysql_query(
                  "SELECT victim.*
                    FROM victim
                    WHERE vic1_business_name OR vic2_business_name  LIKE '%$search_vic_business_name%'
                    AND vic1_fname OR vic2_fname      LIKE '%$search_vic_fname%'
                    AND vic1_lname OR vic2_lname      LIKE '%$search_vic_lname%'
                    AND vic1_address OR vic2_address  LIKE '%$search_vic_address%'
                    AND vic1_city OR vic2_city        LIKE '%$search_vic_city%'
                    AND vic1_state OR vic2_state      LIKE '%$search_vic_state%'
                    AND vic1_dob OR vic2_dob          LIKE '%$search_vic_dob%'

                  ");

<table width="960" style="border: groove;" border=".5">
<tr><th colspan=10>You search results are listed below:</th></tr>
<tr>
<th>Case Number</th>
<th>Business Name</th>
<th>First Name</th>
<th>Last Name</th>
<th>DOB / Age</th>
<th>Address</th>
<th>City</th>
<th>State</th>
</tr>

<?php

while($row = mysql_fetch_array($result))
  { ?>

<tr>
<td align="center"><?php print $row['vic_business_name']; ?></td>
<td align="center"><?php print $row['vic_fname']; ?></td>
<td align="center"><?php print $row['vic_lname']; ?></td>
<td align="center"><?php print $row['vic_dob']; ?></td>
<td align="center"><?php print $row['vic_adress']; ?></td>
<td align="center"><?php print $row['vic_city']; ?></td>
<td align="center"><?php print $row['vic_state']; ?></td>
</tr>

<?php  }    ?>
</table>

在我将表格更改为此之前,信息未显示在表格中:

<tr>
<td align="center"><?php print $row['vic1_business_name']; ?></td>
<td align="center"><?php print $row['vic1_fname']; ?></td>
<td align="center"><?php print $row['vic1_lname']; ?></td>
<td align="center"><?php print $row['vic1_dob']; ?></td>
<td align="center"><?php print $row['vic1_adress']; ?></td>
<td align="center"><?php print $row['vic1_city']; ?></td>
<td align="center"><?php print $row['vic1_state']; ?></td>
</tr>

<tr>
<td align="center"><?php print $row['vic2_business_name']; ?></td>
<td align="center"><?php print $row['vic2_fname']; ?></td>
<td align="center"><?php print $row['vic2_lname']; ?></td>
<td align="center"><?php print $row['vic2_dob']; ?></td>
<td align="center"><?php print $row['vic2_adress']; ?></td>
<td align="center"><?php print $row['vic2_city']; ?></td>
<td align="center"><?php print $row['vic2_state']; ?></td>
</tr>

现在它显示两行,即使它是空的。如果受害者最初被列为vic1或vic2并不重要,我只想知道他们是否是受害者。

我希望这是有道理的。无论你是vic1还是vic2,我都无法逐行显示我想要的方式。

5 个答案:

答案 0 :(得分:2)

你不能写那样的查询。

WHERE ((vic1_business_name LIKE '%$search_vic_business_name%') OR
  (vic2_business_name  LIKE '%$search_vic_business_name%')) AND
 ....

答案 1 :(得分:1)

您应该考虑将其置于第一范式。在某些时候,3名受害者将发生一起事故!这样也可以让您的搜索查询更轻松。

因此,您的受害者表格的结构类似于

caseid (or whatever)
victimid
business_name 
fname
lname
address
city
state
dob

修改在评论中进行讨论。

你说“当我找到你的名字时,我发现你一直是受害者。”这意味着您可能会多次存储受害者的详细信息,并且每次可能会略有不同。

这肯定远非理想,并且似乎可以从应用规范化原则中受益,但它实际上取决于您的应用程序的范围。

如果它基本上只是一个用于记录在纸质表格上输入的值的系统(无论它们是什么),并且不尝试将这些值链接在一起并解决任何此类差异,那么您可能对所获得和使用的内容没有问题Ignacio's answer中的语法。这将解决你实际问的问题!

替代方案更灵活,但可能会增加很多不必要的复杂性。

答案 2 :(得分:1)

我认为OR是一个严格的布尔运算符,因此不能用于返回LIKE匹配的字符串。您必须复制所有表达式,即更改

AND vic1_fname OR vic2_fname      LIKE '%$search_vic_fname%'

AND vic1_fname LIKE '%$search_vic_fname%' OR vic2_fname LIKE '%$search_vic_fname%'

但是,正如Martin Smith和knittl所说的那样,这是一个非常不灵活且难以使用的解决方案!您最好尝试的是创建单独的incidentsvictims表,并为victims表提供一个incident_id表,将其连接到事件。这样,您就可以为事件分配任意数量的受害者。 (也可以制作一个允许受害者出现在多个事件中的系统,但这涉及一个额外的表。)

答案 3 :(得分:1)

那些受害者应该在桌子上真正分开......

目前,让它快速运转的唯一方法是使用:

 SELECT ...
 FROM victim
 WHERE vic1_business_name LIKE '%$search_vic_business_name%' -- etc.
 UNION 
 SELECT ...
 FROM victim
 WHERE vic2_business_name LIKE '%$search_vic_business_name%' -- etc.

但它很麻烦而且不可取。一个单独的表受害者,将victim_relations表连接在一起就可以解决这个问题。

答案 4 :(得分:1)

您可以先尝试让受害者成为更有用的形式:

((SELECT vic1_business_name, vic1_fname, vic1_lname, vic1_address, vic1_city, vic1_state, vic1_dob)
UNION
(SELECT vic2_business_name, vic2_fname, vic2_lname, vic2_address, vic2_city, vic2_state, vic2_dob))

FROM表达式中使用它应该会为您提供所有受害者的列表,每行一个。