2010-06-30 3 views
0

테이블에 저장된 여러 개의 작은 쿼리를 기반으로 자동 생성 된 SQL 쿼리에 문제가 있으며 사용자가 입력 한 것과 결합되었습니다.자동으로 생성 된 SQL 쿼리에 문제가 발생했습니다.

작동하는 쿼리 및 쿼리 자체에 대한 입력을 표시합니다.

입력 한 내용과 실패한 쿼리가 표시됩니다.

누군가 내 입력을 통해 내 쿼리가 실패하는 원인을 지적 할 수 있다면 가장 감사하게 생각합니다.

fromclause :

((`clients` INNER JOIN `addresstorecord` 
    ON `clients`.`uuid` = `addresstorecord`.`recordid` 
    AND `addresstorecord`.`tabledefid`='tbld:6d290174-8b73-e199-fe6c-bcf3d4b61083' 
    AND addresstorecord.primary='1') 
INNER JOIN `addresses` ON `addresstorecord`.`addressid` = `addresses`.`uuid`) 

displayfield :

IF(clients.company != '', 
    CONCAT(clients.company, 
      IF(clients.lastname != '' OR clients.firstname != '', 
      CONCAT(' (', 
        IF(clients.lastname != '', clients.lastname, '{blank}'), 
        ', ', 
        IF(clients.firstname != '', clients.firstname, '{blank}'), 
        ')'), 
      '') 
     ), 
    IF(clients.lastname != '' OR clients.firstname != '', 
     CONCAT(IF(clients.lastname != '', clients.lastname, '{blank}'), 
      ', ', 
      IF(clients.firstname != '', clients.firstname, '{blank}')), 
     '')) 
) 

secondaryfield :

IF(addresses.city != '' OR addresses.state !='' OR addresses.postalcode != '', 
    CONCAT(IF(addresses.city != '', addresses.city, ''), 
     ', ', 
     IF(addresses.state != '', addresses.state, ''), 
     ' ', 
     IF(addresses.postalcode != '', addresses.postalcode, '')), 
    'unspecified location') 

classfield :

clients.type 

searchfields :

clients.company, clients.firstname, clients.lastname 

filterclause : 작동

clients.inactive=0 

쿼리 :

SELECT 
       COUNT(IF(clients.company != '', CONCAT(clients.company,IF(clients.lastname != '' OR clients.firstname != '', CONCAT(' (',if(clients.lastname != '', clients.lastname, '{blank}'),', ',if(clients.firstname != '', clients.firstname, '{blank}'),')'), '')), IF(clients.lastname != '' OR clients.firstname != '', CONCAT(if(clients.lastname != '', clients.lastname, '{blank}'),', ',if(clients.firstname != '', clients.firstname, '{blank}')), ''))) AS thecount 
      FROM 
       ((`clients` INNER JOIN `addresstorecord` ON `clients`.`uuid` = `addresstorecord`.`recordid` AND `addresstorecord`.`tabledefid`='tbld:6d290174-8b73-e199-fe6c-bcf3d4b61083' AND addresstorecord.primary='1') INNER JOIN `addresses` ON `addresstorecord`.`addressid` = `addresses`.`uuid`) 
      WHERE 
       (clients.inactive=0) 

       AND ((clients.company LIKE 'g%' 
OR clients.firstname LIKE 'g%' 
OR clients.lastname LIKE 'g%' 
) OR ((clients.company LIKE 'g%' OR clients.company LIKE '% g%' 
OR clients.firstname LIKE 'g%' OR clients.firstname LIKE '% g%' 
OR clients.lastname LIKE 'g%' OR clients.lastname LIKE '% g%' 
))) 
      SELECT DISTINCT 
       IF(clients.company != '', CONCAT(clients.company,IF(clients.lastname != '' OR clients.firstname != '', CONCAT(' (',if(clients.lastname != '', clients.lastname, '{blank}'),', ',if(clients.firstname != '', clients.firstname, '{blank}'),')'), '')), IF(clients.lastname != '' OR clients.firstname != '', CONCAT(if(clients.lastname != '', clients.lastname, '{blank}'),', ',if(clients.firstname != '', clients.firstname, '{blank}')), '')) AS display, 
       `clients`.`uuid` AS value, 
       IF(addresses.city != '' OR addresses.state !='' OR addresses.postalcode != '', CONCAT(IF(addresses.city != '',addresses.city,''),', ',IF(addresses.state != '', addresses.state, ''),' ',IF(addresses.postalcode != '', addresses.postalcode, '')),'unspecified location') AS secondary, 
       clients.type AS classname 
      FROM 
       ((`clients` INNER JOIN `addresstorecord` ON `clients`.`uuid` = `addresstorecord`.`recordid` AND `addresstorecord`.`tabledefid`='tbld:6d290174-8b73-e199-fe6c-bcf3d4b61083' AND addresstorecord.primary='1') INNER JOIN `addresses` ON `addresstorecord`.`addressid` = `addresses`.`uuid`) 
      WHERE 
       (clients.inactive=0) 

       AND ((clients.company LIKE 'g%' 
OR clients.firstname LIKE 'g%' 
OR clients.lastname LIKE 'g%' 
) OR ((clients.company LIKE 'g%' OR clients.company LIKE '% g%' 
OR clients.firstname LIKE 'g%' OR clients.firstname LIKE '% g%' 
OR clients.lastname LIKE 'g%' OR clients.lastname LIKE '% g%' 
))) 
      ORDER BY 
       IF(clients.company != '', CONCAT(clients.company,IF(clients.lastname != '' OR clients.firstname != '', CONCAT(' (',if(clients.lastname != '', clients.lastname, '{blank}'),', ',if(clients.firstname != '', clients.firstname, '{blank}'),')'), '')), IF(clients.lastname != '' OR clients.firstname != '', CONCAT(if(clients.lastname != '', clients.lastname, '{blank}'),', ',if(clients.firstname != '', clients.firstname, '{blank}')), '')) 
      LIMIT 0, 8 

내 입력

fromclause.

guests 

displayfield :

IF(guests.passport != '', CONCAT(guests.passport ,IF(guests.lastname != '' OR guests.passport!= '', CONCAT(' (',if(guests.lastname != '', guests.lastname, '{blank}'),', ',if(guests.firstname != '', guests.passport, '{blank}'),')'), '')), IF(guests.lastname != '' OR guests.passport!= '', CONCAT(if(guests.lastname != '', guests.lastname, '{blank}'),', ',if(guests.passport!= '', guests.passport, '{blank}')), '')) 

secondaryfield :

classfield :

guests.id 

searchfields :

guests.firstname, guests.lastname, guests.passport 
,617,

filterclause :

guests.id=0 

내 쿼리 실패

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS secondary, 
       guests.id AS classname 
      FROM 
       guests 
      WHERE 
       (guests' at line 4 

Statement: 
      SELECT DISTINCT 
       IF(guests.passport != '', CONCAT(guests.passport ,IF(guests.lastname != '' OR guests.passport!= '', CONCAT(' (',if(guests.lastname != '', guests.lastname, '{blank}'),', ',if(guests.firstname != '', guests.passport, '{blank}'),')'), '')), IF(guests.lastname != '' OR guests.passport!= '', CONCAT(if(guests.lastname != '', guests.lastname, '{blank}'),', ',if(guests.passport!= '', guests.passport, '{blank}')), '')) AS display, 
       `guests`.`uuid` AS value, 
       AS secondary, 
       guests.id AS classname 
      FROM 
       guests 
      WHERE 
       (guests.id=0) 

       AND ((guests.firstname LIKE 'b%' 
OR guests.lastname LIKE 'b%' 
OR guests.passport LIKE 'b%' 
) OR ((guests.firstname LIKE 'b%' OR guests.firstname LIKE '% b%' 
OR guests.lastname LIKE 'b%' OR guests.lastname LIKE '% b%' 
OR guests.passport LIKE 'b%' OR guests.passport LIKE '% b%' 
))) 
      ORDER BY 
       IF(guests.passport != '', CONCAT(guests.passport ,IF(guests.lastname != '' OR guests.passport!= '', CONCAT(' (',if(guests.lastname != '', guests.lastname, '{blank}'),', ',if(guests.firstname != '', guests.passport, '{blank}'),')'), '')), IF(guests.lastname != '' OR guests.passport!= '', CONCAT(if(guests.lastname != '', guests.lastname, '{blank}'),', ',if(guests.passport!= '', guests.passport, '{blank}')), '')) 
      LIMIT 0, 8 
+1

귀하의 질문을 읽고 어려워하고 있습니다 ... – Webnet

+0

가능한 [자동으로 형성된 SQL 쿼리의 구문 오류] (http://stackoverflow.com/questions/3152469/syntax- 오류 자동 작성 SQL 쿼리). 이 점은 읽는 것이 더 어려워지는 것과는 다른 점이 무엇입니까? – gbn

+0

그것은 내 입력을 보여주고 생성 된 쿼리와 제공된 입력을 비교하여 작동하는 쿼리를 생성합니다. 이 질문에서 작업 세트를 비교하여 오류를 판별 할 수 있습니다. – Jacob

답변

0

당신이 차 별칭으로 선택한 필드 이름이없는,

myField as secondary 

가 myField를 교체 같은 것을해야한다 테이블에있는 필드가있는 경우

+0

실제로 사용할 필요가있는 보조 필드가 없습니다 ... 1로 설정해야합니까? – Jacob

+0

보조 주소가 주소로 사용되는 경우 'n/a'또는 유사 검색어를 사용하여 검색어에' 'n/a'를 보조 '로 사용할 수 있습니다. 이것은 '보조'별칭이 데이터를 표시 할 때 사용될 것이라고 가정하기 때문에, 그렇지 않으면 그냥 공백이나 '1'을 사용할 수 있습니다 – laurent

0

쿼리에 실패하면 "secondaryfield"가 비어 있습니다. 그것은 "AS secondary"바로 전에 대체되는 것이므로 결과는 유효한 SQL이 아닙니다.

관련 문제