2010-06-05 6 views
1

"피해자"라는 테이블이있는 DB가 있습니다. 정보를 테이블에 덤프하는 양식에는 두 명의 희생자를위한 공간이 있으므로 vic1_fname, vic1_lname, vic2_fname, vic2_lname 등이 있습니다. (회사 이름, 사람 첫 번째, 사람 마지막, 주소, 도시, 주, 우편) a 1 "와"2 "가 있습니다. 이제 DB를 검색하고 나열된 희생자를 찾고 싶습니다. 나는이에 테이블이 변경 될 때까지비슷한 칼럼 정보를 가진 MySQL 테이블 - HELP!

$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> 

이 지금은 모두 행을 표시를하는 경우에도

내가 지금까지 무엇을 가지고 그것의 빈. 희생자가 원래 피해자 또는 피해자 2 명으로 등록되어 있는지 여부는 중요하지 않습니다. 희생자인지 알고 싶습니다.

나는 이것이 의미가 있기를 바랍니다. 나는 당신이 vic1인지 vic2인지에 상관없이 내가 원하는 방식대로 라인별로 표시 할 수 없다.

+0

db-design을 다시 생각해 볼 수도 있습니다. – knittl

답변

1

아마도 이것을 첫 번째 정규 형식으로보아야합니다. 어떤 시점에서 3 명의 희생자가 발생합니다. 이렇게하면 검색 쿼리가 쉬워집니다.

그래서 피해자 테이블은 주석의 논의에 따라 편집

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

같은 구조 될 것이다.

당신은 "내가 당신의 이름을 알아볼 때 나는 당신이 희생자였던 모든 시간을 발견합니다."라고 말합니다. 이는 아마도 피해자의 세부 정보를 여러 번 저장하고있을 때마다 약간 다를 수 있음을 의미합니다.

이것은 분명히 이상적인 것이 아니며 정상화 원칙을 적용하면 도움이 될 수 있지만 실제로 응용 프로그램의 범위에 따라 달라집니다.

본질적으로 종이 양식에 입력 된 값을 기록하기위한 시스템 일 뿐이며이 둘을 함께 연결시키지 않고 그러한 불일치를 해결하지 않으면 사용자가 가지고있는 것만으로도 충분할 수 있습니다. Ignacio's answer의 구문을 사용하십시오. 어떤 질문을 실제로 해결할 것인가?

대안은 더 유연하지만 불필요한 복잡성을 상당히 증가시킬 수 있습니다.

+0

죄송합니다. 올바르게 게시하려면 문제가 있습니다. 실제로 일부 코드가 누락되었습니다. "일반 양식"이란 무엇을 의미하며 입력 양식은 2 명의 희생자 만 허용합니다. 피해자는이 문서에서 발생하지 않습니다. 각 희생자 목록 vic1, vic2에 대해 테이블을 만든 다음 가입하는 것으로 생각했습니다. 그들이 그렇게하기로 결정하면 미래의 피해자 명부 작성을 허용 할 것입니다. –

+0

@ 조지 내가 조금 더 명확히했습니다. 곧 조금 더 추가하겠습니다. –

+0

당신의 솔루션은 * fields * 추가에서 값 비싼 * 테이블 * 추가에 이르기까지 문제를 해결할 수 있기 때문에 더 나은 솔루션을 찾기 위해 Wrikken과 내 솔루션을 살펴보십시오. 우리의 솔루션에는 * 행 *을 추가하는 것이 포함되며, 이는 결국 DBMS의 목적입니다. – MvanGeest

2

그런 검색어를 쓸 수 없습니다. 내가 OR 생각

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

는 엄격 부울 연산자이므로 LIKE 일치 할 수있는 문자열을 반환하는 데 사용할 수 없습니다. 당신은 즉, 이렇게 정확하게 마틴 스미스와 knittl 발언으로,

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

AND vic1_fname OR vic2_fname  LIKE '%$search_vic_fname%' 

을 변경하지만, 모든 표현을 복제해야합니다, 이것은 매우 유연성 및 사용하기 하드 솔루션입니다 ! 더 나은 방법은 incidentsvictims 테이블을 별도로 만들고 victims 테이블에 incident_id 필드를 연결하여 인시던트에 연결하는 것입니다.그렇게하면 어떤 수의 희생자라도 사건에 지정할 수 있습니다. (그것은 하나 개 이상의 사건에 표시 할 수있는 피해자를 수있는 시스템을 만드는 법 수도 있습니다,하지만 추가 테이블을 포함한다.) 그 피해자는 정말 테이블에 별도의 행을 가져야한다

+0

사건마다 사건 번호가 있습니다. 따라서 각각의 사용자는 자동 ID 번호와 연관된 사례 번호로 피해자 테이블에 추가됩니다. 현재 DB에 총 9 개의 테이블이 있습니다 (사건 세부 사항, 희생자, 체포 자, 증거 등). 각 사건에 대한 사건 번호는 지난 사건의 "사건"에서 발생한 사건의 "당신"을 분리합니다. –

+0

그럼 왜 vic1과 vic2가 필요한가요? 사례 번호가 누구와 같은지 (희석) 모든 희생자를 선택하여 희생자를 한 사건에 대해 얻고 희생자 당 한 행을 사용하기 만하면됩니다. 아니면 여기에 뭔가 빠졌나요? – MvanGeest

+0

@MvanGeest PHP에서 테이블을 생성하는 좋은 형식으로 데이터베이스에서 돌아 오는 방식을 볼 수 있습니다. –

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 테이블을 함께 사용하면 트릭을 수행 할 수 있습니다.

+1

+1하지만 victim_relations는 일대 다 또는 다 대다인지 알 수 없으므로 필요하지 않을 수 있습니다. –

+0

두 개를 두 테이블 (victim1 victim2)으로 분리 한 다음 제안한대로 가입합니다. 도와 줘서 고마워. –

+0

@ George - 그건 제안이 아니 었습니다!희생자 1과 희생자 2 사이에 의미 적 차이가 없다는 것을 분명히하기 위해서입니까? 희생자가 2 명인 경우 희생자 1이든 희생자 2이든간에 그것은 임의적입니다. –

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 표현에 당신에게 모든 피해자, 한 줄에 하나의 목록을 제공해야 사용.

+0

피해자마다 별도의 테이블을 제안 할 의향이 있습니까? –

+0

아니요, 당신이 사용하는 것이 좋습니다. 내가 검색을 위해 제공 한 조합 (마치 희생 테이블 자체 인 것처럼). 내가 선택한 선택 조합은 원본 테이블과 동일한 데이터를 제공하지만 한 줄에 하나의 희생자를 분할합니다. – VeeArr