SQL SELECT 并在查询中连接多个表时出错?
SQL SELECT and join multiple tables erron in query?
我的查询按预期工作:
$sql = '
SELECT s.rowid
, f.fk_soc
, s.nom
, f.datef
, sc.fk_soc
, sc.fk_user
, u.rowid
, u.firstname
, u.lastname
FROM societe s
JOIN societe_commerciaux sc
ON s.rowid = sc.fk_soc
JOIN user u
ON sc.fk_user = u.rowid
LEFT
JOIN facture f
ON s.rowid = f.fk_soc
GROUP
BY s.rowid
HAVING MAX(f.datef) <= CURRENT_TIMESTAMP - INTERVAL '.$db->escape($dlo).' DAY
';
$resql = $db->query($sql);
if (!$resql) {
dol_print_error($db);
}
背景:
用户 - table 包含用户的名字和姓氏以及主要身份。 rowid
Societe - table 客户名称 s.nom
主要身份。 rowid
facture - table 带有日期为 datef
和 fk_soc
的客户发票,这是客户 ID (s.rowid)
societe_commerciaux - 通过将 fk_soc
(实际上是 s.rowid)与 fk_user(u.rowid)
工作脚本列出了在 $dlo
和销售代表姓名设置的期间内没有发票的所有客户。
我想做的是,调整结果以显示没有特定销售代表(即用户)发票的客户。
我有一个工作脚本,用于填充下拉列表 select
<form>
<select name='repselect' onchange='showUser(this.value)'>
<option value="here comes the value for id of sales representative 1">Sales Representative name 1</option>
<option value="here comes the value for id of sales representative 2">Sales Representative name 2</option>
</select>
</form>
值字段中的 ID 是来自 table 用户的 bot rowid
和来自 table societe_commerciaux.
的 fk_ser
我还有一个可用的 ajax 脚本来填充结果。
这个脚本就像我把 print $sql;
放进去一样工作,我可以在 select 一个用户后看到查询。
我苦苦挣扎的是如何调整上述查询以仅显示下拉列表中 selected 的销售代表的结果。我将此 id 传递给文件 'script.php',其中我有 $userid = intval($_GET['q']);
后跟查询。我可以处理输出。这只是我无法正确调整的查询。
此查询return 来自客户的用户代表信息,上一张发票(实际)日期小于(CURRENT_TIMESTAMP - INTERVAL)或从未有过发票:
$sql = '
SELECT
u.rowid,
u.firstname,
u.lastname
FROM societe s
INNER JOIN societe_commerciaux sc ON s.rowid = sc.fk_soc
INNER JOIN user u ON sc.fk_user = u.rowid
WHERE s.rowid NOT IN (
SELECT f.fk_soc
FROM facture f
GROUP BY f.fk_soc
HAVING MAX(f.datef) > CURRENT_TIMESTAMP - INTERVAL ' . $db->escape($dlo) . ' DAY)
GROUP BY u.rowid, u.firstname, u.lastname
';
您应该使用准备好的语句并且不要在普通查询中粘贴参数 $dlo,以防止 sql 注入。
这是我使用的最后一个查询:
SELECT ';
s.rowid,
s.nom,
s.phone,
s.email,
sc.fk_soc,
sc.fk_user,
u.rowid,
u.firstname,
u.lastname,
f.max_datef
FROM
' . MAIN_DB_PREFIX . 'societe s
INNER JOIN
' . MAIN_DB_PREFIX . 'societe_commerciaux sc ON s.rowid = sc.fk_soc
AND sc.fk_user="' . $this->userId . '"
INNER JOIN
' . MAIN_DB_PREFIX . 'user u ON sc.fk_user = u.rowid
INNER JOIN (
SELECT Max($this->typeDate) As max_datef, fk_soc
FROM
' . MAIN_DB_PREFIX . 'facture
GROUP BY fk_soc
'HAVING max_datef <= CURRENT_TIMESTAMP - INTERVAL $this->interval DAY
) f ON s.rowid = f.fk_soc
ORDER BY max_datef ASC
我的查询按预期工作:
$sql = '
SELECT s.rowid
, f.fk_soc
, s.nom
, f.datef
, sc.fk_soc
, sc.fk_user
, u.rowid
, u.firstname
, u.lastname
FROM societe s
JOIN societe_commerciaux sc
ON s.rowid = sc.fk_soc
JOIN user u
ON sc.fk_user = u.rowid
LEFT
JOIN facture f
ON s.rowid = f.fk_soc
GROUP
BY s.rowid
HAVING MAX(f.datef) <= CURRENT_TIMESTAMP - INTERVAL '.$db->escape($dlo).' DAY
';
$resql = $db->query($sql);
if (!$resql) {
dol_print_error($db);
}
背景:
用户 - table 包含用户的名字和姓氏以及主要身份。 rowid
Societe - table 客户名称 s.nom
主要身份。 rowid
facture - table 带有日期为 datef
和 fk_soc
的客户发票,这是客户 ID (s.rowid)
societe_commerciaux - 通过将 fk_soc
(实际上是 s.rowid)与 fk_user(u.rowid)
工作脚本列出了在 $dlo
和销售代表姓名设置的期间内没有发票的所有客户。
我想做的是,调整结果以显示没有特定销售代表(即用户)发票的客户。
我有一个工作脚本,用于填充下拉列表 select
<form>
<select name='repselect' onchange='showUser(this.value)'>
<option value="here comes the value for id of sales representative 1">Sales Representative name 1</option>
<option value="here comes the value for id of sales representative 2">Sales Representative name 2</option>
</select>
</form>
值字段中的 ID 是来自 table 用户的 bot rowid
和来自 table societe_commerciaux.
fk_ser
我还有一个可用的 ajax 脚本来填充结果。
这个脚本就像我把 print $sql;
放进去一样工作,我可以在 select 一个用户后看到查询。
我苦苦挣扎的是如何调整上述查询以仅显示下拉列表中 selected 的销售代表的结果。我将此 id 传递给文件 'script.php',其中我有 $userid = intval($_GET['q']);
后跟查询。我可以处理输出。这只是我无法正确调整的查询。
此查询return 来自客户的用户代表信息,上一张发票(实际)日期小于(CURRENT_TIMESTAMP - INTERVAL)或从未有过发票:
$sql = '
SELECT
u.rowid,
u.firstname,
u.lastname
FROM societe s
INNER JOIN societe_commerciaux sc ON s.rowid = sc.fk_soc
INNER JOIN user u ON sc.fk_user = u.rowid
WHERE s.rowid NOT IN (
SELECT f.fk_soc
FROM facture f
GROUP BY f.fk_soc
HAVING MAX(f.datef) > CURRENT_TIMESTAMP - INTERVAL ' . $db->escape($dlo) . ' DAY)
GROUP BY u.rowid, u.firstname, u.lastname
';
您应该使用准备好的语句并且不要在普通查询中粘贴参数 $dlo,以防止 sql 注入。
这是我使用的最后一个查询:
SELECT ';
s.rowid,
s.nom,
s.phone,
s.email,
sc.fk_soc,
sc.fk_user,
u.rowid,
u.firstname,
u.lastname,
f.max_datef
FROM
' . MAIN_DB_PREFIX . 'societe s
INNER JOIN
' . MAIN_DB_PREFIX . 'societe_commerciaux sc ON s.rowid = sc.fk_soc
AND sc.fk_user="' . $this->userId . '"
INNER JOIN
' . MAIN_DB_PREFIX . 'user u ON sc.fk_user = u.rowid
INNER JOIN (
SELECT Max($this->typeDate) As max_datef, fk_soc
FROM
' . MAIN_DB_PREFIX . 'facture
GROUP BY fk_soc
'HAVING max_datef <= CURRENT_TIMESTAMP - INTERVAL $this->interval DAY
) f ON s.rowid = f.fk_soc
ORDER BY max_datef ASC