2014-10-20 4 views
0

하나의 테이블 (작업)뿐만 아니라 다른 관련 테이블 (활동)에서 검색하는 검색 기능을 구현하려고합니다. 활동에는 그것이 속하는 타스크 (타스크 테이블의 키 ID)가 식별되는 열 이름 타스크가 있습니다. 내가 작업 테이블을 검색하는 방법은 다음과 같습니다PHP에서 두 개의 sql 쿼리 결과 병합

SELECT 
    tasks.* 
FROM 
    tasks 
WHERE 
    (
     (
      tasks.description LIKE '%$search%' 
      OR tasks. NAME LIKE '$search%' 
     ) 
     AND tasks. USER = '$userid' 
    ); 

방법 내가 활동 테이블 인 검색 :

SELECT DISTINCT 
    tasks.* 
FROM 
    activities, 
    tasks 
WHERE 
    tasks. USER = '1' 
AND activities.description LIKE '%$search%'; 

는 각각의 쿼리가 작동하고 모두 반환 작업 테이블 데이터. 내가하고 싶은 일은 (PHP에서) 두 결과를 병합하여 모든 테이블 작업 항목을 반복없이 만 얻는 것입니다.

어떻게하면됩니까?

+0

왜 두 개의 쿼리를 실행하고 나중에 array_merge()를 사용하여 병합하지 않을까요? (물론 성능 관련 문제는 아닙니다.) –

+0

어떻게 결합해야합니까? 활동과 태스크의 결과가 서로 관련이없는 경우 array_merge를 사용할 수 있습니다. 그렇지 않으면 반환 된 배열을 반복하고 일치시켜야합니다 (그렇다면 SQL에서 조인을 고려해야 할 것입니다). – SheperdOfFire

+0

이것이 나에게 발생하는 방법이었습니다. 필자는 지능형 SQL 쿼리 솔루션을 선호합니다. – aarelovich

답변

0

어느 두 개의 쿼리를 실행하고 (가능한 중복 돌보는) 이후 array_merge()의 변형을 사용하여 결과를 병합, 또는 단순히 OR 연산자를 사용하여 두 개의 SELECT 문에 WHERE 절을 연결합니다

SELECT 
    DISTINCT tasks.* 
FROM 
    activities, 
    tasks 
WHERE 
    (
     (
      tasks.description LIKE '%$search%' 
      OR tasks.NAME LIKE '$search%' 
     ) 
     AND tasks.USER = '$userid' 
    ) 
    OR 
    (
     tasks.USER = '$userid' 
     AND activities.description LIKE '%$search%' 
    ); 

일부 적용 부울 최적화 :

SELECT 
    DISTINCT tasks.* 
FROM 
    activities, 
    tasks 
WHERE 
    tasks.USER = '$userid' 
    AND 
    (
     tasks.description LIKE '%$search%' 
     OR tasks.NAME LIKE '$search%' 
     OR activities.description LIKE '%$search%' 
    ); 

어쨌든, 코드를보고 나는 확실히 당신이 0123에 의해 SQL injection에 대해 자신을 보호하는 희망또는 PDOStatement::bindParam을 사용하면이를 처리 할 수 ​​있습니다.

+0

두 번째 옵션 Worked !. 나는 그것을 보지 못했다고 믿을 수 없다. 고맙습니다!!. SQL 코드를 삽입하는 것이 어떻게 가능할까요? 나는 이해하지 못한다. 나는 구문을 완전히 깨뜨릴 것이다. 그리고, 나는 그 명령을 사용하지 않는다. 그러나 나는 이것에서 초보자이다. – aarelovich

+0

'$ search'에'''또는' '); SHOW TABLES; -'가 포함 된 변수를 입력하면 어떻게되는지보십시오. 따라서 사용자 입력을 위생적으로 처리하는 것이 중요합니다. PDO와 같은 라이브러리를 올바르게 사용하면 이런 종류의 보안 문제가 완화됩니다. –

+0

답변 해 주셔서 감사합니다. 하지만 여전히 que SQL 주입을 이해하지 못합니다. 나는 하나의 hola (첫 번째 옵션 테스트)를 작성하고 두 번째 제안을 복사하여 붙여 넣었습니다. SQL 구문 오류 (사용자에게 닫을 수있는 레이블로 오류 표시)에서 오류가 발생했습니다. 그래서 예상대로 문법이 깨졌습니다. – aarelovich