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_poststable.

中的post_file个id

我需要做一些澄清以便更好地理解。 post_file实际上是由i_user_uploadstable中的upload_ids组成的。例如,post_file 2,14实际上代表了i_user_uploads中的upload_id。看看DEMO.

中的图表会更容易理解

查询中的输出应该是这样的。 post_file中的upload_ids应该跟在post_file之后,i_user_uploadstable中的uploaded_file_ext = 'mp3'应该打印在屏幕上。

更详细地解释一下,post_file 1实际上是i_user_uploads table中的upload_id 1。如果这个 id 中的 uploaded_file_extmp3,那么它会打印在屏幕上。

问题是 i_posts table 中的 post_file 有时包含多个 id 而这些 ids 用逗号分隔。例如 post_file 15,2,3post_file 15,2。但是 cast(P.post_file as signed int) = A.upload_id 只接受第一个 id 并忽略逗号后的另一个 ids

如果 post_file 15,2,3 中的 15 不是 mp3 文件,并且 2mp3 扩展名,它会忽略 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)