[英]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.