我正在尝试在mySQL(和php(中编写一个选择,该选择将在"图像"表中检索尚未由某个用户排名的所有行。
那是我的桌子:
表:图像
+-----------+----------+-----------+----------+
| Index | Rank_Good| Rank_OK | Rank_Bad |
+-----------+----------+-----------+-----------
| 201 | 2 | 9 | 28 |
| 202 | 11 | 20 | 39 |
| 203 | 36 | 14 | 7 |
+-----------+----------+-----------+----------+
table2: whoaldreadclickedimg (没有索引(
+------------+-----------------+-----------+
| ImageIndex | UserWhoRankedIt | RankGiven |
+------------+-----------------+-----------+
| 202 | 87 | OK |
+------------+-----------------+-----------+
| 202 | 93 | Bad |
+------------+-----------------+-----------+
| 204 | 93 | Good |
+------------+-----------------+-----------+
| 203 | 94 | Bad |
+------------+-----------------+-----------+
每次用户对图像进行排名时,将更新表"图像",然后将一行添加到" WhoalDreadyClickedimg"表中。(此表没有索引(
例如,如果用户排名的图像索引202带有"确定",则Col" rank_ok"将更新为( 1(,然后,将添加一个新的行,P>
ImageIndex:201 |用户whorankedit :(使用的会话ID( | rankgiven:OK
我想构建一个不会向已经对其进行排名的用户两次显示同一图像的选择。
例如,如果我是用户" 93",则选择将带来的唯一图像是" 203"
更新:
这是我正在使用的查询(@eamonn(:
从图像中选择 *索引不在其中 (从whoalreadyclickedimg中选择userwhorankedit = 93(;
但是我有一个错误:
您在SQL语法中有错误;查看与您的MySQL Server版本相对应的手册,以获取正确的语法,以便使用" index not In In In In"(从whoaldreadclickedimg中选择userwhorankedim的userwhorankedit'in 1
>我检查了我的系统:
存储引擎:Innodb
mysql db版本:5.5.33-29.3
现在两张表都有索引,int(11(,定义为primary,auto_increment
也许有人有一个主意?
那里,这应该有效:
SELECT Images.Index
FROM Images
WHERE Images.Index NOT IN
(
SELECT WhoAlreadyClickedImg.ImageIndex
FROM WhoAlreadyClickedImg
WHERE WhoAlreadyClickedImg.UserWhoRankedIt = 93
);
记住在列的名称之前添加表的名称。
SELECT * FROM Images WHERE Index NOT IN
(SELECT ImageIndex FROM WhoAlreadyClickedImg WHERE UserWhoRankedIt = 93);
简单的子查询。
好吧,列名索引是MySQL中的保留关键字。您应该将索引列的名称更改为ID或MainIndex。请参阅此链接:https://dev.mysql.com/doc/refman/5.6/en/keywords.html
另一个选项是在选择查询中使用表名。例如:
SELECT * FROM Images WHERE Images.Index NOT IN (SELECT ImageIndex FROM WhoAlreadyClickedImg WHERE UserWhoRankedIt = 93);
我认为您应该重命名您的专栏,因为这可以最大程度地减少SQL语句中错误的机会。