簡體   English   中英

MySQL-WHERE子句中的變量來自SELECT語句

[英]MySQL - Variable in WHERE clause result from SELECT statement

我有這個查詢:

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;

基本上,我不得不重復DATE_SUB(DATE_SUB('2017-05-16', INTERVAL Giorni_reminder DAY)日期結果,這使我DATE_SUB(DATE_SUB('2017-05-16', INTERVAL Giorni_reminder DAY)

有沒有辦法在該日期在MySQL中聲明變量?

就像是:

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

然后像這樣使用它:

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')

我已經搜索過,對於所發現的內容,沒有辦法,或者不允許在WHERE子句中聲明變量或別名,但是也許有一種解決方法,可以避免在同一查詢中多次鍵入相同的內容。

與往常一樣,謝謝大家,祝您愉快!

更新1:

我看過@TimBiegeleisen的鏈接,我發現它非常非常有趣。 但是我從事的項目使用不推薦使用的mysql API進行查詢。 參見示例:

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

考慮到這一點, Prepared語句仍然可行嗎?

返回OP,這是在查詢中我需要的地方(在WHERE子句中)聲明變量的方法嗎?

更新2:

這是為什么的澄清: 如何在MySQL中聲明變量?

對我不起作用,或者我沒有設法使其起作用。

我不必聲明靜態數據,我想聲明一個SELECT結果的變量。

我想在WHERE子句中存儲和繼續使用的數據是DATE_SUB('2017-05-16', INTERVAL Giorni_reminder DAY) ,我刪除了PHP變量,因為我記得會造成混亂。

僅僅是Giorni_reminder是SELECT的結果,我想在WHERE子句中使用它。 如果您看到查詢,那么我將重復同一件事。

我想避免這種情況。

因此,這樣的事情對我不起作用:

SET @start = 1, @finish = 10;  

我需要在OP中發布的內容。 如果可能的話

如果不可能,那我就學到了教訓! :d

Editted-2
請刪除/更新下面的定義器以匹配您的數據庫。

  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM