SELECT a.* FROM wsy_dream.ShopDistribute a INNER JOIN wsy_dream.ShopActivity b where a.Isvalid=1 and a.Acquirer_id = 138058 and FIND_IN_SET(1,b.ShopType) ORDER BY CASE a.Consumption WHEN 1 then 99 end desc,a.ID desc;上面这条sql语句,b表只有一条ShopType=1,的数据,为什么查询结果会是全部
时间: 2024-03-16 11:47:32 浏览: 109
根据你提供的 SQL 语句,查询结果会返回 a 表中 Acquirer_id 为 138058,且 Isvalid 为 1,且 ShopType 为 1 的所有记录,因为在查询语句中使用了 INNER JOIN 来连接 a 表和 b 表,并且使用了 FIND_IN_SET 函数来判断 ShopType 是否为 1,但是没有使用 WHERE 子句来限制 b 表中只有一条 ShopType=1 的数据,因此查询结果会返回 a 表中所有符合条件的记录。如果想要限制结果只返回 b 表中 ShopType=1 的数据,则可以在查询语句中添加一个子查询,如下所示:
```
SELECT a.*
FROM wsy_dream.ShopDistribute a
INNER JOIN (
SELECT * FROM wsy_dream.ShopActivity WHERE ShopType = 1
) b ON a.Acquirer_id = b.Acquirer_id
WHERE a.Isvalid=1
ORDER BY CASE a.Consumption WHEN 1 THEN 99 END DESC, a.ID DESC;
```
这样,查询结果就只会返回 a 表中 Acquirer_id 为 138058,且 Isvalid 为 1,且 ShopType 为 1 的记录。
相关问题
SELECT a.* FROM wsy_dream.ShopDistribute a INNER JOIN ( SELECT * FROM wsy_dream.ShopActivity WHERE FIND_IN_SET(2, ShopType) > 0 UNION SELECT * FROM wsy_dream.ShopActivity WHERE FIND_IN_SET(5, ShopType) > 0 UNION SELECT * FROM wsy_dream.ShopActivity WHERE FIND_IN_SET(4, ShopType) > 0 ) b INNER JOIN wsy_o2o.weixin_cityarea_supply c ON a.Activity_id = b.ID WHERE a.Isvalid=1 and a.Acquirer_id = 138058 and a.Shop_id = c.id and c.types = 20 ORDER BY CASE a.Consumption WHEN 1 THEN 99 END DESC, a.ID DESC; 上述中 inner join 里的值如何使用mybatis xml来进行拼接
在 MyBatis XML 映射文件中,可以使用动态 SQL 标签来实现 SQL 拼接,例如在这个例子中使用 `<foreach>` 标签来拼接 SQL 语句。
可以将内部 JOIN 的语句拼接到一个变量中,然后通过 `<foreach>` 标签遍历一个集合,将集合中的元素动态拼接到 SQL 语句中。具体实现可以参考以下代码:
```
<select id="selectData" resultType="yourResultType">
SELECT a.*
FROM wsy_dream.ShopDistribute a
INNER JOIN (
<foreach collection="activityIds" item="item" separator=" UNION ">
SELECT * FROM wsy_dream.ShopActivity WHERE FIND_IN_SET(#{item}, ShopType) > 0
</foreach>
) b
INNER JOIN wsy_o2o.weixin_cityarea_supply c ON a.Activity_id = b.ID
WHERE a.Isvalid=1 and a.Acquirer_id = 138058 and a.Shop_id = c.id and c.types = 20
ORDER BY CASE a.Consumption WHEN 1 THEN 99 END DESC, a.ID DESC;
</select>
```
在这个例子中,假设 `activityIds` 是一个包含需要查询的 ShopActivity 的 ID 的列表,通过 `<foreach>` 标签将这个列表中的元素动态拼接到 SQL 语句中,从而实现内部 JOIN 的功能。注意,`separator` 属性指定了每个元素之间的分隔符,这里使用了 UNION。同时,在 MyBatis 中,使用 `#{}` 语法来占位符表示需要从参数中获取值,避免了 SQL 注入的问题。
SQL: SELECT a.*,b.ShopType FROM wsy_dream.ShopDistribute a INNER JOIN ( ? ) b INNER JOIN wsy_o2o.weixin_cityarea_supply c ON a.Activity_id = b.ID WHERE a.Isvalid=1 and a.Acquirer_id = ? and a.Shop_id = c.id and c.types = 20 ORDER BY CASE a.Consumption WHEN 1 THEN 99 END DESC, a.ID DESC; ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''SELECT * FROM wsy_dream.ShopActivity WHERE FIND_IN_SET(2, ShopType) > 0 UNION S' at line 4 如何解决
根据错误提示,这个 SQL 查询语句存在语法错误。具体来说,错误在于第 4 行的子查询语句中存在问题。解决方法是检查子查询语句的语法是否正确,并且确认子查询语句返回的结果是否符合要求。
在这个 SQL 语句中,第 4 行的子查询语句是一个动态的查询,其中 `?` 是一个占位符,可能会被替换成一个具体的查询语句。因此,需要检查程序中生成这个 SQL 语句的代码,确认占位符是否被正确地替换成了具体的查询语句。
另外,还需要确认这个 SQL 语句中其他部分的语法是否正确,比如第 3 行和第 5 行的 JOIN 子句。如果还存在其他问题,也需要进行逐一排查和修复。
阅读全文