cast() 仅采用第一个 ID 并忽略 sql 查询中的其他 ID
cast() only takes first id and ignores other ids in sql query
这里是 DEMO 以便更好地理解问题所在。
以下 sql 查询仅打印 i_user_uploads table 中具有 uploaded_file_ext
的 mp3 值的查询。从查询中可以理解,i_user_uploads
中的数据取自i_posts
table.
中的post_file
个id
我需要做一些澄清以便更好地理解。
post_file实际上是由i_user_uploads
table中的upload_ids
组成的。例如,post_file 2,14
实际上代表了i_user_uploads
中的upload_id
。看看DEMO.
中的图表会更容易理解
查询中的输出应该是这样的。 post_file中的upload_ids应该跟在post_file之后,i_user_uploads
table中的uploaded_file_ext = 'mp3'
应该打印在屏幕上。
更详细地解释一下,post_file 1
实际上是i_user_uploads
table中的upload_id 1
。如果这个 id
中的 uploaded_file_ext
是 mp3
,那么它会打印在屏幕上。
问题是 i_posts table 中的 post_file
有时包含多个 id
而这些 ids
用逗号分隔。例如 post_file 15,2,3
或 post_file 15,2
。但是 cast(P.post_file as signed int) = A.upload_id
只接受第一个 id
并忽略逗号后的另一个 ids
。
如果 post_file 15,2,3
中的 15
不是 mp3
文件,并且 2
是 mp3
扩展名,它会忽略 2
并且不打印到屏幕。
SELECT P.*,U.*,A.*
FROM i_friends F FORCE INDEX(ixFriend)
INNER JOIN i_posts P FORCE INDEX (ixForcePostOwner)
ON P.post_owner_id = F.fr_two
INNER JOIN i_users U FORCE INDEX (ixForceUser)
ON P.post_owner_id = U.iuid AND U.uStatus IN('1','3') AND F.fr_status IN('me', 'flwr', 'subscriber')
INNER JOIN i_user_uploads A FORCE INDEX (iuPostOwner)
ON P.post_owner_id = A.iuid_fk
AND P.post_file <> '' AND A.uploaded_file_ext = 'mp3'
WHERE P.post_owner_id='1'
AND cast(P.post_file as signed int) = A.upload_id
ORDER BY P.post_id
DESC LIMIT 5
您可以使用 FIND_IN_SET()
而不是 CAST()
来检查某个值是否存在于逗号分隔的字符串中:
WHERE P.post_owner_id='1' AND FIND_IN_SET(A.upload_id, P.post_file)
这里是 DEMO 以便更好地理解问题所在。
以下 sql 查询仅打印 i_user_uploads table 中具有 uploaded_file_ext
的 mp3 值的查询。从查询中可以理解,i_user_uploads
中的数据取自i_posts
table.
post_file
个id
我需要做一些澄清以便更好地理解。
post_file实际上是由i_user_uploads
table中的upload_ids
组成的。例如,post_file 2,14
实际上代表了i_user_uploads
中的upload_id
。看看DEMO.
查询中的输出应该是这样的。 post_file中的upload_ids应该跟在post_file之后,i_user_uploads
table中的uploaded_file_ext = 'mp3'
应该打印在屏幕上。
更详细地解释一下,post_file 1
实际上是i_user_uploads
table中的upload_id 1
。如果这个 id
中的 uploaded_file_ext
是 mp3
,那么它会打印在屏幕上。
问题是 i_posts table 中的 post_file
有时包含多个 id
而这些 ids
用逗号分隔。例如 post_file 15,2,3
或 post_file 15,2
。但是 cast(P.post_file as signed int) = A.upload_id
只接受第一个 id
并忽略逗号后的另一个 ids
。
如果 post_file 15,2,3
中的 15
不是 mp3
文件,并且 2
是 mp3
扩展名,它会忽略 2
并且不打印到屏幕。
SELECT P.*,U.*,A.*
FROM i_friends F FORCE INDEX(ixFriend)
INNER JOIN i_posts P FORCE INDEX (ixForcePostOwner)
ON P.post_owner_id = F.fr_two
INNER JOIN i_users U FORCE INDEX (ixForceUser)
ON P.post_owner_id = U.iuid AND U.uStatus IN('1','3') AND F.fr_status IN('me', 'flwr', 'subscriber')
INNER JOIN i_user_uploads A FORCE INDEX (iuPostOwner)
ON P.post_owner_id = A.iuid_fk
AND P.post_file <> '' AND A.uploaded_file_ext = 'mp3'
WHERE P.post_owner_id='1'
AND cast(P.post_file as signed int) = A.upload_id
ORDER BY P.post_id
DESC LIMIT 5
您可以使用 FIND_IN_SET()
而不是 CAST()
来检查某个值是否存在于逗号分隔的字符串中:
WHERE P.post_owner_id='1' AND FIND_IN_SET(A.upload_id, P.post_file)