2010-06-30 3 views
0

Je rencontre des problèmes avec une requête SQL générée automatiquement, basée sur plusieurs requêtes plus petites stockées dans une table, et combinée avec les entrées de l'utilisateur.Problème avec la requête SQL générée automatiquement

Je vais montrer les entrées pour une requête qui fonctionne, puis la requête elle-même.

Je vais ensuite montrer mes entrées, et la requête qui échoue.

Si quelqu'un pouvait me signaler quelle entrée j'ai utilisé qui fait échouer ma requête, je vous serais très reconnaissant.

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 

La requête qui fonctionne:

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 

Mes entrées

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 

filterclause:

guests.id=0 

Ma requête qui échoue:

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

J'ai du mal à lire vos requêtes et ce que vous faites ... – Webnet

+0

duplication possible de [Erreur de syntaxe dans la requête SQL automatiquement formée] (http://stackoverflow.com/questions/3152469/syntax- error-in-automatically-form-sql-query). En quoi cela diffère-t-il d'être plus difficile à lire s'il vous plaît? – gbn

+0

il montre mon entrée, et la requête générée par rapport à l'entrée fournie et générer une requête qui fonctionne. Dans cette question, il permet de comparer un ensemble de travail, pour aider à déterminer les erreurs. – Jacob

Répondre

0

vous ne disposez pas d'un nom de champ sélectionné avec l'alias secondaire, devrait être quelque chose comme

myField as secondary 

remplacement myField avec le champ de la table

+0

Je n'ai pas de champ secondaire que je devrais utiliser ... devrais-je juste le définir comme 1 quelque chose? – Jacob

+0

Comme le secondaire est utilisé pour l'adresse, vous pouvez utiliser 'n/a' ou quelque chose de similaire lors du montage de la requête pour avoir un résultat comme: '' n/a 'comme secondaire' dans la requête. Cela parce que je suppose que l'alias 'secondary' sera utilisé lors de l'affichage des données, sinon vous pouvez simplement utiliser un espace ou' 1' – laurent

0

Dans vos paramètres pour le requête qui échoue, "secondaryfield" est vide. C'est ce qui est substitué juste avant "AS secondary", donc le résultat n'est pas SQL valide.

Questions connexes