[英]join query returning odd results
我使用此查询来显示歌曲列表,并显示用户单击了哪些歌曲作为收藏。
$query = mysql_query(
sprintf("
SELECT
s.*,
UNIX_TIMESTAMP(`date`) AS `date`,
f.userid as favoritehash
FROM
songs s
LEFT JOIN
favorites f
ON
f.favorite = s.id
AND f.userid = %s",
$userhash)
);
songs
表设置为: id artist title duration
等。
favorites
表设置为: id favorite userid
userid
是存储在cookie中以引用唯一用户的哈希值。
该查询工作正常,但是由于某种原因,如果我在一个浏览器中将歌曲标记为收藏,则出于某种原因。 然后在同一浏览器中将同一首歌曲标记为“我的收藏”以模拟多个用户,这首歌曲将显示两次...每次将其标记为“我的收藏”,但“ <3”收藏夹指示符仍会正确显示。
有任何想法吗?
可以通过删除sprintf()使其正常工作,但是很好奇为什么这是任何人都有想法的原因。
我有一个类似的问题,我想如果您将And F.userid =%s更改为f.userid =%s,它应该解决此问题?
您正在使用sprintf和%s(字符串),但没有将结果字符串值括在引号中。 如果用户ID是字符串,则需要将其用引号引起来,否则请使用%d代替%s。 因为当您删除sprintf时它工作正常,这似乎是问题所在。
我觉得你ON
-clause是错误的。
试试这个代替:
ON f.favorite = s.id
WHERE f.userid = %s
我相信先前的建议实际上会击败LEFT JOIN
,使其成为INNER JOIN
; f.userid
有时为NULL
,并且NULL
总是比较为false
。
我将从查看“ favorites
表的内容开始。 如果我了解您的模式,您可能希望在favorites
favorite
上建立一个唯一键,而不是favorite
和userid
,以确保给定用户只能将每首歌曲收藏一次。 也就是说,您可能会得到重复的行,从而导致重复的结果。
因为您使用的是“左联接”,所以我假设您想要所有歌曲的列表,并且希望用户的收藏夹易于区分。 即这样的事情:
song1 details | date | null
song2 details | date | userhash (favorite)
song3 details | date | null
请尝试以下操作:
SELECT s.*, UNIX_TIMESTAMP(`date`) AS `date`, f.userid as favoritehash
FROM
songs s
LEFT JOIN
(SELECT userid, favorite FROM favorites WHERE userid = %s) f
ON
f.favorite = s.id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.