2010-12-13 4 views
2

나는 데이터베이스MySQL의 선택 결합 테이블/필드

BRAND 
- id 
- name 

PRODUCT 
- id 
- brand_id 
- name 

사이트의 사용자가 하나의 텍스트 필드를 사용하여 제품을 검색합니다 2 개 테이블을 가지고있다.

예 1 : "sony"가 BRAND 테이블에 있고 "dvd player"가 PRODUCT 테이블에있는 "sony dvd player".

예 2 : "car audio pioneer deh-1234",이 경우 "car audio deh-1234"는 PRODUCT에 속하고 BRAND의 개척자입니다.

결과를 검색하는 고유 한 SQL 쿼리를 작성할 수있는 방법이 있습니까? 이 같은

뭔가 : 어떤 도움

SELECT 
    B.name,P.name 
FROM 
    brand B,product P 
WHERE 
    B.id=P.brand_id 
    AND (P.nombre LIKE '%{$textfield}%' OR B.name LIKE '%{textfield}%') 

감사합니다. :)

편집 : 위의 SQL은 결합 된 브랜드/제품이 아니라 제품 또는 브랜드에서 작동합니다. $ textfield에 사용 된 변수 이름을 하나의 단일 텍스트 입력으로 편집했습니다.

+0

이미 게시 한 내용으로 작동하지 않으려면 어떻게해야합니까? – mdarwi

+0

@mdarwi가 아니라면, 첫 번째 단계는 입력 필드의 모든 데이터를 분해하는 것입니다. – gustyaquino

+0

예, 그 필드를 폭발시키는 것은 좋은 방법입니다. 아래 내 대답을 참조하십시오. 또한, 혼합 언어는 무엇입니까? –

답변

0

당신은

--PHP--

$t = $_POST('textField1'); 
$tArr = explode(' ', $t); 
$lastClause = ''; 
foreach ($tArr as $k=>$v) 
{ 
    if ($k != 0) $lastClause .= ' OR '; 
    $lastClause .= " B.name LIKE '%$v%' OR P.name LIKE '%$v%' "; 
} 


$sql = "SELECT B.name,P.name 
     FROM 
     brand B,product P 
     WHERE 
     B.id=P.brand_id 
     AND ($lastClause)"; 

mysql_query($sql, $conn); 

나는 또한 당신이 사용하도록 쿼리를 변경하는 것이 좋습니다 것 PHP에서 수행하고, SQL,이 꽤 쉽게하는 무슨 부품 재고하는 경우 INNER JOIN,하지만 그건 또 다른 문제 야.

정렬에 관한 한, 그것이 중요한 경우. ORDER BY를 각 개별 부분의 lastClause에 두는 것을 권장합니다. 일치 항목> 1, 일치하지 않음 -> 0

+0

정확히 사용자 텍스트 입력은 모든 단어를 임의의 순서로, 심지어 불필요한 단어까지 포함 할 수 있습니다. – gustyaquino

2

두 가지 이유가 있습니다. 브랜드 및 제품 정보를 표시합니다. 예를 들어, "sony dvd player"를 검색하면 두 테이블에서 "%sony dvd player%"을 검색합니다. 그러나 아마도 그러한 항목이 없습니다 (brand 또는 product에는 없음).

대신 검색 문자열을 분리하고 "개별적으로"부품을 검색해야합니다. 예 :

P.name LIKE '%sony%' OR p.name LIKE '%dvd%' OR p.name LIKE '%player%' OR b.name LIKE ... 

표현식을 동적으로 생성해야합니다. 그런 다음 결과를 "확률"값으로 정렬하여 첫 번째 위치에서 더 높은 일치를 갖는 행을 가질 수 있습니다.

+0

이것은 좋은 해결책입니다. 생각할 수있는 유일한 다른 점은 결과의 순서를 "더 똑똑하게"하려면 추가 논리를 추가해야한다는 것입니다. 예를 들어, "소니 플레이 스테이션"과 같은 것보다 높은 등급을 얻으려면 정확히 일치하는 "소니 DVD 플레이어"가 필요합니다. – jocull

+0

예, 당신은 완전히 옳습니다. 나는'levenshtein'이 그 일을 아주 잘 할 것이라고 생각한다. – Flinsch

+0

이 경우에이 거리를 구현하는 데 매우 관심이 있습니다. 가능하면 누구에게도 알 수 있습니까? – gustyaquino

0

@gustyaquino : 귀하의 코드가 작동해야, 그냥 작은 업데이트를 필요로 -

SELECT 
    B.name,P.name 
FROM 
    brand B,product P 
WHERE 
    B.id = P.brand_id 
    AND (P.name LIKE '%{$textfield}%' OR B.name LIKE '%{textfield}%') 

namenombre 교체, 세뇨 르 ;-)

업데이트

@hol을 : I 셸에서 SQL 코드를 테스트 한 결과 작동했습니다. 나는 이미 응답 한 후에 gustyaquino의 편집을 알아 차렸고, 나를 향해 뛰어 와서 나를 투표하는 모습을 보러 돌아왔다.

mysql> create database so4432028; 
Query OK, 1 row affected (0.16 sec) 

mysql> use so4432028; 
Database changed 

mysql> create table brand (id int not null auto_increment, 
name varchar(20) not null default '', 
primary key(`id`)); 
Query OK, 0 rows affected (0.34 sec) 

mysql> create table product (id int not null 
auto_increment, name varchar(40) not null default '', 
brand_id int not null, primary key(`id`), 
key brand (`brand_id`)); 
Query OK, 0 rows affected (0.08 sec) 

mysql> insert into brand (name) values ('Sony'); 
Query OK, 1 row affected (0.08 sec) 

mysql> insert into brand (name) values ('LG'); 
Query OK, 1 row affected (0.02 sec) 

mysql> insert into brand (name) values ('Panasonic'); 
Query OK, 1 row affected (0.01 sec) 

mysql> insert into product (name, brand_id) values ('DVD Player', 1); 
Query OK, 1 row affected (0.09 sec) 

mysql> insert into product (name, brand_id) values ('Plasma Television', 2); 
Query OK, 1 row affected (0.06 sec) 

mysql> insert into product (name, brand_id) values ('CD Player', 3); 
Query OK, 1 row affected (0.03 sec) 

mysql> select p.name, b.name from brand b, product p where b.id = p.brand_id and 
(p.name like '%Sony%' OR b.name LIKE '%Sony%'); 
+------------+------+ 
| name  | name | 
+------------+------+ 
| DVD Player | Sony | 
+------------+------+ 
1 row in set (0.09 sec) 
+0

코드는 작동하지. 그 오타가 내가 그가 말할 것을 요구하는 이유가 아니었다. – hol

+0

@hol 그 죄송합니다 .. 내 실수는 실제 코드에 없습니다. – gustyaquino

+0

@gustyquino. 알아. 내 의견은 @stealthyninja 쪽이었다. 나는 그저 그 문제를 해결하지 못했기 때문에 대답이 마음에 들지 않는다고 말하고 싶었습니다. – hol