【问题标题】:New query within MySql query based on an initial query result基于初始查询结果的 MySql 查询中的新查询
【发布时间】:2013-10-08 14:00:20
【问题描述】:

我正在尝试从一个表 (“SP_Cont”) 中获取联系信息,然后根据县代码 (CID) 从“Counties”表中获取实际的县名称 (“CTitle”)。

SELECT 
CONCAT_WS(', ',NULLIF(SP_Cont.Address1, ''),NULLIF(SP_Cont.Address2, ''),NULLIF(SP_Cont.Address3, ''),NULLIF(SP_Cont.Address4, ''),NULLIF(SP_Cont.Address5, ''),NULLIF(SP_Cont.City, ''),NULLIF(Postcode, '')) AS Address, SP_Cont.CID, SP_Cont.RevTot,
Counties.CTitle
FROM 
  SP_Cont
INNER JOIN
  Counties
ON
  Counties.CID=SP_Cont.CID
WHERE
  SP_Cont.SPCode = "26"

我想要实现的是一个看起来像这样的地址......

地址 1、地址 2、地址 3、城市、县、邮政编码。

我知道上面不会这样做,但至少我不必像目前那样在 PHP 页面中运行另一个查询来添加县:

if (!empty($BAPrint['CID'])) {
 $CQuery = mysql_query ("SELECT CTitle FROM Counties USE INDEX (CIDT) WHERE CID = ".$BAPrint['CID']);
  $CPrint = mysql_fetch_array ($CQuery);
  $Address .= ", ".$CPrint['CTitle'];
}

所以它看起来像这样:

Address1、Address2、Address3、城市、邮政编码、县。

有没有办法得到想要的地址格式

Address1、Address2、Address3、城市、县、邮政编码。?

另一个问题是如果 SP_Cont 不包含 CID 代码,则脚本会失败。无论如何使用 CONCAT_WS 如果有一个 NULL CID 脚本仍然运行,但没有县标题?

干杯 G

【问题讨论】:

  • 您的查询看起来不错,您可以将所有需要的字段添加到 concat_ws。如果您没有得到任何结果,那是因为您在应用过滤器后得到了结果。您的过滤器是内部连接条件和 where:“ Counties.CID=SP_Cont.CID and SP_Cont.SPCode = 26”
  • @AdrianBR 你是对的。我刚刚使用了一个我知道有 CID 代码的 SPCode,它显示了 1 个结果。问题在这里很清楚,如果没有 CID 代码,则脚本无法产生任何结果。即使 CID 代码为空/NULL,有没有办法 concat_ws 我上面提到的所有字段?为您的评论干杯。
  • 如果您没有 CID 代码,则无法加入您的县表。您可以将连接更改为左连接,因此 SP_CONT 表中的结果无论如何都会被发布。另外,ifnull,not nullif
  • @AdrianBR 是的,可行:) 我想你不知道你是否可以在 CONCAT_WS 中进行内部连接,以便我可以按照我想要的方式对其进行格式化?干杯
  • 你可以,贴在下面

标签: php mysql select inner-join concat-ws


【解决方案1】:

nullif 的工作方式有点不同http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_nullif

SELECT 
CONCAT_WS(', ',
  nullif(SP_Cont.Address1, ''),
  nullif(SP_Cont.Address2, ''),
  nullif(SP_Cont.Address3, ''),
  nullif(SP_Cont.Address4, ''),
  nullif(SP_Cont.Address5, ''),
  nullif(SP_Cont.City, ''),
  nullif(Counties.CTitle, '')
  nullif(Postcode, '')
) AS Address, 

SP_Cont.CID, SP_Cont.RevTot


FROM  SP_Cont
LEFT JOIN Counties
ON Counties.CID=SP_Cont.CID

WHERE SP_Cont.SPCode = "26"

【讨论】:

  • 这只会产生类似“Loughborough Sports Club, Moor Lane, , , , Loughborough, , LE11 1ST”的内容。不应该有的附加逗号。 NULLIF 删除了不需要的逗号“Loughborough Sports Club, Moor Lane, Loughborough, LE11 1ST”。将县名放入地址字符串是问题所在,嗯
  • 我想我需要先了解如何获取 CID 代码,然后获取 Counties.CTitle,然后运行包含 CTitle 的 CONCAT_WS。
  • CTitle 是县名,不是吗?它在上面的查询中。
  • 另外,nullif 是对的。我知道 concat(string, null) 返回 null,不知道 concat_ws(separator,string, null) 不会返回 null
  • 改回nullif
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多