SQL内部联接和
我在SQL查询中遇到一些问题SQL内部联接和,sql,Sql,我在SQL查询中遇到一些问题 SELECT s.searchword AS searchword, s.id AS id, COUNT( c.id ) AS searchresult, s.region AS region FROM search_words AS s INNER JOIN company_data AS c ON c.text LIKE CONCAT( '%', s.searchword, '%' )
SELECT
s.searchword AS searchword,
s.id AS id,
COUNT( c.id ) AS searchresult,
s.region AS region
FROM search_words AS s
INNER JOIN company_data AS c ON
c.text LIKE CONCAT( '%', s.searchword, '%' )
AND c.region = s.region
GROUP BY 1 ORDER BY s.date DESC
结果
[{“searchword”:“批发”,“searchid”:“416”,“搜索结果”:“31”,“地区”:“斯德哥尔摩”},{“searchword”:“业务”,“searchid”:“329”,“搜索结果”:“1”,“地区”:“斯德哥尔摩”},{“searchword”:“医院”,“searchid”:“330”,“搜索结果”:“1”,“地区”:“斯德哥尔摩”},{“交通”,“searchid”:“337”,“搜索结果”:“4”,“地区”:“斯德哥尔摩”}{“搜索词”:“电子”、“搜索ID”:“334”、“搜索结果”:“4”、“地区”:“斯德哥尔摩”}、{“搜索词”:“汽车”、“搜索ID”:“338”、“搜索结果”:“3”、“地区”:“斯德哥尔摩”}、{“搜索词”:“食品”、“搜索ID”:“340”、“搜索结果”:“11”、“地区”:“斯德哥尔摩”}、{“搜索词”:“零售”、“搜索ID”:“342”、“搜索结果”:“8”、“地区”:“斯德哥尔摩”}、{“搜索词”:“租赁”searchid:“343”,“searchresult:“1”,“region:“stockholm”}]
这里的问题是…区域列中所有区域的值都为空。
我也需要收集这些…正如你所看到的,它只收集斯德哥尔摩
所以我在想类似于
SELECT
s.searchword AS searchword,
s.id AS id,
COUNT( c.id ) AS searchresult,
s.region AS region
FROM search_words AS s
INNER JOIN company_data AS c ON
c.text LIKE CONCAT( '%', s.searchword, '%' )
AND c.region = s.region OR s.region = ''
GROUP BY 1 ORDER BY s.date DESC
但它不起作用:(空”值“,或null
s,在SQL中不是实值-它们是缺少的值,需要由is
运算符显式处理。此外,和
的优先级高于或
,因此处理区域的所有条件都应放在括号中:
SELECT
s.searchword AS searchword,
s.id AS id,
COUNT( c.id ) AS searchresult,
s.region AS region
FROM search_words AS s
INNER JOIN company_data AS c ON
c.text LIKE CONCAT( '%', s.searchword, '%' ) AND
(c.region = s.region OR s.region IS NULL)
GROUP BY 1 ORDER BY s.date DESC
如果您的区域可以是NULL
或'
(空值),则这是检查的防弹方法:
COALESCE(s.region, '') = ''
这样,在与空字符串进行比较之前,您可以将NULL
替换为'
。根据目前提供的信息,您可能需要继续尝试
SELECT
s.searchword AS searchword,
s.id AS id,
COUNT( c.id ) AS searchresult,
IFNULL(s.region, 'all') AS region
FROM search_words AS s
INNER JOIN company_data AS c
ON IFNULL(s.region, 'all') = IFNULL(c.region, 'all')
AND c.text LIKE CONCAT( '%', s.searchword, '%' )
GROUP BY 1, 2, 4
ORDER BY s.date DESC
;
查看它的实际操作:
如果需要调整/进一步详细信息,请发表意见。特别是,请随时调整SQL FIDLE(并提供到更新版本的链接)。“不起作用”在任何数据库管理系统中都不是有效的错误消息。错误到底是什么?您使用哪种数据库管理系统?Postgres?Oracle?包括不符合JOIN
标准的记录,通常是使用OUTER JOIN
s而不是internal JOIN
s来完成的。您能否提供表结构和样本数据预期输出?您使用的是哪个数据库系统的哪个版本?a_horse,对不起,我不知道什么是DBMS,这是php,我使用mysql。对不起,也许我应该在mysql中添加这个问题。abecee,我一点都不擅长连接。如果没有其他人可以帮助我,也许我会添加更多信息。