我想写一个非常复杂的SQL查询。要求如下:复杂的MySQL查询问题和SQL挂起
我需要从查询返回这些字段:
track.artist
track.title
track.seconds
track.track_id
track.relative_file
album.image_file
album.album
album.album_id
track.track_number
我可以选择一个随机曲目用下面的查询:
select
track.artist, track.title, track.seconds, track.track_id,
track.relative_file, album.image_file, album.album,
album.album_id, track.track_number
FROM
track, album
WHERE
album.album_id = track.album_id
ORDER BY RAND() limit 10;
下面是我在哪里虽然有麻烦。我也有一个名为“trackfilters1”到“trackfilters10”的表格。每行都有一个自动递增的ID字段。因此,第10行是album_id 10的数据。这些字段填充1和0。例如,专辑#10有10首曲目,如果所有曲目都包含在搜索中,则trackfilters1.flags将包含“1111111111”。如果轨道10被排除,那么它将包含“1111111110”
我的问题是包括这个条款。
我已经拿出了最新的查询如下:
select
track.artist, track.title, track.seconds,
track.track_id, track.relative_file, album.image_file,
album.album, album.album_id, track.track_number
FROM
track, album, trackfilters1, trackfilters2
WHERE
album.album_id = track.album_id
AND
((album.album_id = trackfilters1.id)
OR
(album.album_id=trackfilters2.id))
AND
((mid(trackfilters1.flags, track.track_number,1) = 1)
OR
(mid(trackfilters2.flags, track.track_number,1) = 1))
ORDER BY RAND() limit 2;
然而,这导致SQL挂起。我假设我做错了什么。有人知道它是什么吗?如果有更简单的方法来实现我的最终结果,我会接受建议,如果有更好的方法来完成此操作,我不会修复已损坏的查询。
另外,在我的试验中,我注意到当我有一个工作查询并且在FROM子句中添加了说,trackfilters2而没有在查询中的任何地方使用它时,它也会挂起。这让我感到惊讶。这是正确的行为?我想如果不使用这些数据就可以添加到FROM列表中,只会让服务器获得更多的数据,我不会期望它挂起。
_“那么trackfilters1.flags将包含”1111111111“,如果所有曲目将包含在搜索中。如果轨道10被排除,那么它将包含“1111111110”“_ - 这听起来像是一个非常糟糕的数据库设计。你应该正常化。 – CBroe
这是因为当你只使用逗号分开的两个表时,你正在做交叉产品,即一个表的每一行与另一个表的每一行连接。因此,当你包含trackfilters2,但不在where子句中使用它,你的系统最终会因为交叉产品而挂起 – Naruto
也许我可以看看一些数学计算。我有一个想法做一些类似于CHMOD的数字在Linux中,你可以使用一个3位数字来确定9个位置,可能有三个状态之一(rwxrwxrwx),但认为这将是一个更合理的方法,因为我可以使用MID在查询内拉出轨道号的位置。我想知道这是否与你的建议相似。我现在将阅读正常化。感谢您的回复 –