Php 从其他表中不存在的表中选择行

Php 从其他表中不存在的表中选择行,php,mysqli,Php,Mysqli,我想选择存在于images表中但不存在于images\u viewed表中的行。他们都有相同的名字 这是我正在使用的代码。它工作,但它使我的网站非常缓慢 $next = $mysqli->query("SELECT `name` FROM `images` WHERE `name` NOT IN (SELECT `name` FROM `images_viewed` WHERE `ip` = '$ip') ORDER BY RAND() LIMIT 1"); if($nex

我想选择存在于images表中但不存在于images\u viewed表中的行。他们都有相同的名字

这是我正在使用的代码。它工作,但它使我的网站非常缓慢

$next = $mysqli->query("SELECT `name` FROM `images` WHERE `name` NOT IN (SELECT `name` FROM `images_viewed` WHERE `ip` = '$ip') ORDER BY RAND() LIMIT 1");
        if($next->num_rows == 1){   
            $fetch_next = $next->fetch_assoc();
            $next_name = $fetch_next['name'];
        }
如何修复此代码?我可以使用更好的select语句吗?

试试:

SELECT images.name FROM images 
  LEFT OUTER JOIN images_viewed 
    ON images.name = images_viewed.name 
  WHERE images_viewed.ANY_OTHER_FIELD IS NULL AND images_views.ip = {$ip}

此SQL是正确的,但是通过在
图像
表中添加一个索引列来跟踪图像是否已被查看,可以进一步提高性能。然后,您对一个表进行索引查询,而不是联接或子查询。@Zhube,您是对的,但是OP必须在N:M关系表中通过IP映射查看的图像。在OP中没有捕获IP部分。在这种情况下,内部联接可能会更有效,而且数据库将更加规范化。使用
内部连接
他将只获取已查看的图像,但他希望获取未查看的图像。这是真的。我没有考虑用我最初的回复来跟踪IP的观点,只是考虑它们是否被浏览过。因此,建议使用一个标志来过滤。:)