Php SQL参数数据类型int对于charindex函数的参数1无效
我正在尝试将MySQL查询转换为MsSql查询,但遇到了问题。我的问题是: MySQLPhp 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_
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-立即更新检查