Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL参数数据类型int对于charindex函数的参数1无效_Php_Mysql_Sql_Sql Server - Fatal编程技术网

Php SQL参数数据类型int对于charindex函数的参数1无效

Php SQL参数数据类型int对于charindex函数的参数1无效,php,mysql,sql,sql-server,Php,Mysql,Sql,Sql Server,我正在尝试将MySQL查询转换为MsSql查询,但遇到了问题。我的问题是: MySQL SELECT *, (SELECT count(books.id) FROM books WHERE books.status = 1 AND FIND_IN_SET(categories.id, books.multiple_category_id)) AS book_count FROM categories, books WHERE categories.parent_

我正在尝试将MySQL查询转换为MsSql查询,但遇到了问题。我的问题是:

MySQL

SELECT *,
(SELECT count(books.id)
   FROM books
   WHERE books.status = 1
     AND FIND_IN_SET(categories.id, books.multiple_category_id)) AS book_count
   FROM categories, books
   WHERE categories.parent_id=0
     AND categories.status=1 ;
我试过了

SELECT *,
  (SELECT count(books.id)
   FROM books
   WHERE books.status = 1
     AND CHARINDEX(categories.id, books.multiple_category_id) > 0) AS book_count
   FROM categories, books
   WHERE categories.parent_id=0
     AND categories.status=1 ;
我得到的错误是:

Argument data type int is invalid for argument 1 of charindex function.
供参考。

有人有什么想法吗?
提前谢谢

使用此查询。我刚刚将
categories.id
更改为
CAST(categories.id为VARCHAR)
。因为
id
categories
表中是
integer

SELECT *,
(SELECT count(books.id)
   FROM books
   WHERE books.status = 1
     AND CHARINDEX(CAST(categories.id AS VARCHAR), books.multiple_category_id) > 0) AS book_count
FROM categories,
     books
WHERE categories.parent_id=0
  AND categories.status=1 ;

这里有另一种方法

SELECT *,
       (SELECT Count(books.id)
        FROM   books
        WHERE  books.status = 1
               AND ',' + books.multiple_category_id + ',' LIKE '%,' + cast(categories.id as varchar(50))+ ',%') AS book_count
FROM   categories,
       books
WHERE  categories.parent_id = 0
       AND categories.status = 1; 
注意:查询中的
类别
书籍
表之间存在笛卡尔积。我想您不需要在
From
子句中使用
书籍。停止在列中存储逗号分隔的值。它违反了第一个标准格式

MS-SQL
的函数要求使用VARCHARs或NVARCHARs作为参数,因此您的categories.id应转换为VARCHAR。大概是这样的:

CHARINDEX(CAST(categories.id AS VARCHAR(16)), books.multiple_category_id ) > 0 )
AND EXISTS (SELECT 1 FROM dbo.SplitString(books.multiple_category_id) WHERE Token = categories.id)

但是,我会考虑对表和查询进行重构:

1。查询重构

正如所写的,您可以有错误的匹配。例如,
categories.id=1
而您的
多个\u categories\u id
'11,12'
。另一种选择是让您的病情如下:

CHARINDEX(CAST(categories.id AS VARCHAR(16)), books.multiple_category_id ) > 0 )
AND EXISTS (SELECT 1 FROM dbo.SplitString(books.multiple_category_id) WHERE Token = categories.id)
此外,*应替换为实际需要的列(在本例中,它将带来两个表中的所有列)。大概是这样的:

CHARINDEX(CAST(categories.id AS VARCHAR(16)), books.multiple_category_id ) > 0 )
AND EXISTS (SELECT 1 FROM dbo.SplitString(books.multiple_category_id) WHERE Token = categories.id)
2。表重构

您不应该解析字符串,而应该像这样定义一个X表:

CHARINDEX(CAST(categories.id AS VARCHAR(16)), books.multiple_category_id ) > 0 )
AND EXISTS (SELECT 1 FROM dbo.SplitString(books.multiple_category_id) WHERE Token = categories.id)
分类手册 类别ID FK参考类别 bookId FK参考书 主键(类别ID、bookId)


因此,您可以使用简单的
JOIN
s进行查询,而不是使用较慢的字符串搜索(不能使用索引)。

感谢您花宝贵的时间回答此问题。。KudosDownvoting的任何原因?将varchar值“%”,转换为数据类型int时,转换失败。@Chinnu-立即更新检查