首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mySQL -使用联接进行选择,还是嵌套选择(子选择)?

mySQL -使用联接进行选择,还是嵌套选择(子选择)?
EN

Stack Overflow用户
提问于 2017-05-31 11:18:02
回答 3查看 1.3K关注 0票数 0

我正在尝试用mySQL (和PHP)编写一个SELECT,它将检索“图像”表中的所有行,这些行还没有被某个用户排行。

这是我的桌子:

表:图片

代码语言:javascript
复制
+-----------+----------+-----------+----------+
| Index     | Rank_Good| Rank_OK   | Rank_Bad |
+-----------+----------+-----------+-----------
| 201       | 2        | 9         | 28       |
| 202       | 11       | 20        | 39       |
| 203       | 36       | 14        | 7        |
+-----------+----------+-----------+----------+

WhoAlreadyClickedImg (没有索引)

代码语言:javascript
复制
+------------+-----------------+-----------+
| ImageIndex | UserWhoRankedIt | RankGiven |
+------------+-----------------+-----------+
| 202        | 87              | OK        |
+------------+-----------------+-----------+
| 202        | 93              | Bad       |
+------------+-----------------+-----------+
| 204        | 93              | Good      |
+------------+-----------------+-----------+
| 203        | 94              | Bad       |
+------------+-----------------+-----------+

每当用户对图像进行排序时,就会更新表“image”,并将一行添加到"WhoAlreadyClickedImg“表中。(本表没有索引)

例如,如果用户将图像索引202与"ok“进行排序,那么col "Rank_OK”将被更新为(+1),然后将一个新行添加到"WhoAlreadyClickedImg“表中:

ImageIndex: 201 \ UserWhoRankedIt:(使用的会话id) = RankGiven: OK

我想要建立一个选择,将不会显示相同的图像两次给用户谁已经排名。

例如,如果我是用户"93",则select将带来的唯一图像是"203“

更新:

这是我使用的查询(by @eamonn):

从索引非IN的图像中选择*(从ImageIndex从WhoAlreadyClickedImg中选择UserWhoRankedIt = 93);

但我发现了一个错误:

您的SQL语法出现了错误;请检查与MySQL服务器版本相对应的手册,以获得使用“Index”附近的正确语法(在第1行中从WhoAlreadyClickedImg中选择ImageIndex WhoAlreadyClickedImg UserWhoRankedIt)。

我检查了我的系统:

  • 存储引擎: InnoDB
  • MySQL db版本: 5.5.33-29.3
  • 这两个表现在都有索引int(11),定义为主表,auto_increment

也许有人有主意?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-02 13:09:26

在那里,这应该是可行的:

代码语言:javascript
复制
SELECT Images.Index 
       FROM Images 
       WHERE Images.Index NOT IN 
             (
                SELECT WhoAlreadyClickedImg.ImageIndex 
                     FROM WhoAlreadyClickedImg 
                     WHERE WhoAlreadyClickedImg.UserWhoRankedIt = 93
             );

记住在列名之前添加表的名称。

票数 1
EN

Stack Overflow用户

发布于 2017-05-31 11:21:09

SELECT * FROM Images WHERE Index NOT IN (SELECT ImageIndex FROM WhoAlreadyClickedImg WHERE UserWhoRankedIt = 93);

简单子查询。

票数 1
EN

Stack Overflow用户

发布于 2017-06-01 09:52:53

好的,列名索引是MySQL中的保留关键字。应将索引列的名称更改为Id或MainIndex。请参阅此链接:https://dev.mysql.com/doc/refman/5.6/en/keywords.html

另一个选项是在select查询中使用表名。例如:

代码语言:javascript
复制
SELECT * FROM Images WHERE Images.Index NOT IN (SELECT ImageIndex FROM WhoAlreadyClickedImg WHERE UserWhoRankedIt = 93);

我认为您应该重命名您的列,因为这样可以最大限度地减少SQL语句中出错的可能性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44283361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档