2017-05-16 4 views
0

Ich habe diese Anfrage:MySQL - Variable in WHERE-Klausel resultiert aus SELECT-Anweisung

INSERT INTO tab_reminder (ID_cliente, ID_articolo, Data_acquisto) 
     SELECT c.ID_cliente as cliente, ca.ID_articolo as articolo, MAX(c.Data_contratto) as ultimoAcquisto 
     FROM tab_contratti_articoli ca 
     LEFT JOIN tab_contratti c ON c.ID_contratto = ca.ID_contratto 
     LEFT JOIN tab_articoli a ON ca.ID_articolo = a.ID_articolo 
     LEFT JOIN tab_clienti cl ON c.ID_cliente = cl.ID_cliente 
     WHERE c.ID_cliente != 0 
     AND cl.ID_utente = 0 
     AND Giorni_reminder != 0 
     AND c.Data_contratto <= DATE_SUB('2017-05-16', INTERVAL Giorni_reminder DAY) 
     AND c.Data_contratto > DATE_SUB(DATE_SUB('2017-05-16', INTERVAL Giorni_reminder DAY), INTERVAL 60 DAY) 
     AND (c.Data_contratto NOT BETWEEN DATE_SUB('2017-05-16', INTERVAL Giorni_reminder DAY) AND '2017-05-16') 
     GROUP BY c.ID_cliente, ca.ID_articolo 
ON DUPLICATE KEY UPDATE ID_cliente=ID_cliente, ID_articolo=ID_articolo, Data_acquisto=Data_acquisto, Articolo_visibile=Articolo_visibile; 

Im Grunde ist es ärgert mich, dass ich DATE_SUB(DATE_SUB('2017-05-16', INTERVAL Giorni_reminder DAY) Datum Ergebnis wiederholen.

Gibt es eine Möglichkeit, eine Variable in MySQL für dieses Datum zu deklarieren?

Etwas wie:

SET @newDate := DATE_SUB(DATE_SUB('2017-05-16', INTERVAL Giorni_reminder DAY); 

Und dann ist es wie folgt verwenden:

AND c.Data_contratto <= @newDate 
AND c.Data_contratto > DATE_SUB(@newDate, INTERVAL 60 DAY) 
AND (c.Data_contratto NOT BETWEEN @newDate AND '2017-05-16') 

Ich habe gesucht und für das, was ich gefunden habe, gibt es keine Möglichkeit oder es ist nicht Variablen erlaubt zu erklären oder Aliase in der WHERE-Klausel, aber möglicherweise gibt es eine Problemumgehung, um zu vermeiden, dasselbe in derselben Abfrage mehrere Male einzugeben.

Wie immer, danke euch allen und habt einen schönen Tag!

Update 1:

Ich habe @ TimBiegeleisen den Link gesehen und ich finde es sehr, sehr interessant. Aber das Projekt, in dem ich arbeite, verwendet die veraltete mysql-API zur Abfrage. Siehe Beispiel:

$sqlExample = "SELECT * FROM tab_example"; 
$qExample = mysql_query($sqlExample) or die ("Error in $sqlExample: ".mysql_error()); 
$rsExample = mysql_fetch_object($qExample); 

diese Unter Berücksichtigung, sind noch Prepared statements rentabel?

Zurück zu OP, ist es eine Möglichkeit, die Variable in der Abfrage zu deklarieren, wo ich es brauche (In WHERE Klausel)?

Update 2:

Dies ist eine Klarstellung, warum dies: How to declare a variable in MySQL?

für mich funktioniert nicht oder ich bin nicht die Verwaltung es funktioniert.

Ich muss keine statischen Daten deklarieren, ich möchte eine Variable deklarieren, die Ergebnis eines SELECT ist.

Die Daten, die ich innerhalb der WHERE Klausel speichern und weiter verwenden möchte, ist diese DATE_SUB('2017-05-16', INTERVAL Giorni_reminder DAY), ich entfernte die PHP-Variable, weil ich mich erinnern kann, kann Verwirrung schaffen.

Ist nur das Giorni_reminder ist ein Ergebnis der SELECT und ich möchte es in WHERE-Klausel verwenden. Wenn Sie die Abfrage sehen, wiederhole ich das Gleiche mehrmals.

Ich wollte das vermeiden.

Also, so etwas wie das nicht für mich arbeiten:

SET @start = 1, @finish = 10; 

Ich brauche etwas, wie in OP geschrieben. Wenn es möglich ist.

Wenn es nicht möglich ist, dann habe ich eine Lektion gelernt!: D

+4

Kennen Sie mit [vorbereitete Anweisungen] gehört (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)? –

+0

@TimBiegeleisen Nein, schau es dir jetzt an. Danke für den Link. Aber wir (in der Firma, in der ich arbeite) benutzen msqli im Moment nicht. – SrAxi

+0

Interessant ... welche API benutzen Sie dann, um MySQL abzufragen? –

Antwort

0

Editted-2
Bitte entfernen/aktualisieren, um die definer unter Ihrer Datenbank übereinstimmen.

CREATE DEFINER=`Connect7827`@`%` PROCEDURE `new_procedure`(iN UserIput varchar(1000)) 
    BEGIN 

    declare vNewDate_Value varchar(100); 
    SET vNewDate_Value=concat("","DATE_SUB(DATE_SUB('2017-05-16', INTERVAL Giorni_reminder DAY)"); 

    Set @vquery=concat_ws 
       ("","INSERT INTO tab_reminder (ID_cliente, ID_articolo, Data_acquisto) 
       SELECT c.ID_cliente as cliente, ca.ID_articolo as articolo, MAX(c.Data_contratto) as ultimoAcquisto 
       FROM tab_contratti_articoli ca 
       LEFT JOIN tab_contratti c ON c.ID_contratto = ca.ID_contratto 
       LEFT JOIN tab_articoli a ON ca.ID_articolo = a.ID_articolo 
       LEFT JOIN tab_clienti cl ON c.ID_cliente = cl.ID_cliente 
       WHERE c.ID_cliente != 0 
       AND cl.ID_utente = 0 
       AND Giorni_reminder != 0 
       AND c.Data_contratto <= vnewDate 
       AND c.Data_contratto > DATE_SUB(vNewDate, INTERVAL 60 DAY) 
       AND (c.Data_contratto NOT BETWEEN vNewDate AND '$oggi') 
       GROUP BY c.ID_cliente, ca.ID_articolo 
       ON DUPLICATE KEY UPDATE ID_cliente=ID_cliente, ID_articolo=ID_articolo, Data_acquisto=Data_acquisto, Articolo_visibile=Articolo_visibile;"); 
       Set @vquery= replace(@vquery,'$oggi','2017-05-16'); 
       Set @vquery= replace(@vquery,'vNewDate',vNewDate_Value); 
       Select @vquery; 

       PREPARE stmt FROM @vquery; 
       EXECUTE stmt; 

    END 
+0

Danke für Ihre Antwort. Die Sache ist, dass ich die Abfrage vereinfachen und versuchen wollte, das generierte Datum zu vermeiden. In Ihrer Antwort verkompliziert sich die Abfrage und die Aussage, die ich vermeiden wollte zu wiederholen, wird die gleiche Anzahl von Malen wiederholt ... Vielleicht habe ich nicht gut erklärt, es passiert oft ...: S – SrAxi

+0

@SrAxi lassen Sie mich Wissen Sie, wenn Sie eine Erklärung brauchen, Definer bedeutet Schema. –

+0

Ich habe mein OP bearbeitet und die '$ oggi' entfernt. Das ist nicht der wichtige Teil. Die Sache ist, dass ich ein Ergebnis meiner Auswahl erhalten, es in einer Variablen deklarieren und in der WHERE-Klausel verwenden möchte. – SrAxi

Verwandte Themen