我试图写一个SELECT在mySQL (和PHP),将检索“图像”表中的所有行,尚未由某个用户排名。
下面是我的表格:
表:图片
+-----------+----------+-----------+----------+------------+
| Index | Rank_Good| Rank_OK | Rank_Bad | Is_Allowed |
+-----------+----------+-----------+----------+------------+
| 201 | 2 | 9 | 28 | true |
| 202 | 11 | 20 | 39 | false |
| 203 | 36 | 14 | 7 | true |
+-----------+----------+-----------+----------+------------+
Table2: WhoAlreadyClickedImg (没有索引)
+------------+-----------------+-----------+
| ImageIndex | UserWhoRankedIt | RankGiven |
+------------+-----------------+-----------+
| 202 | 87 | OK |
+------------+-----------------+-----------+
| 202 | 93 | Bad |
+------------+-----------------+-----------+
| 204 | 93 | Good |
+------------+-----------------+-----------+
| 203 | 94 | Bad |
+------------+-----------------+-----------+
我的逻辑是:当用户对图像进行排名时,我会在"WhoAlreadyClickedImg“表中添加一行,其中包含刚刚对其进行排名的用户的id和图像id (以及排名)。(这将为该表中的每个图像创建数千行,并且它的增长速度很快。)
然后,当用户想要对一张图片进行排名时,我会在"WhoAlreadyClickedImg“表中查找哪些图片还没有被他排名,并将" images”表中的参数Images.Is_Allowed添加到查询中(所以我将只向他显示一张可以排名的图片)。
首先,我使用sub-select来做这件事,但事实证明,它会为它检查的每一行调用subselect,而且它非常非常慢。
SELECT Images.Index
FROM Images
WHERE Images.Index NOT IN
(
SELECT WhoAlreadyClickedImg.ImageIndex
FROM WhoAlreadyClickedImg
WHERE WhoAlreadyClickedImg.UserWhoRankedIt = 93
);
AND Images.Is_Allowed = 1
ORDER BY RAND()
LIMIT 1
我不知道怎么使用JOIN (从来没有做过,也不熟悉什么是最好的-- Left join/inner还是right)
https://stackoverflow.com/questions/44624130
复制相似问题