php - 从 Table1 中选择一个随机行,其中 id 在 Table2 中不存在

标签 php mysql sql

我尝试从 Table1 中选择一 (1) 个随机行,其中 Table1 中的 Data_ID 在 Table2 中不存在。

我正在那里建立一个网站,您可以对帖子(图像)进行投票,并且在此页面上您应该只能看到没有任何投票的帖子。

这是我的两个表的简单结构:

CREATE TABLE IF NOT EXISTS `Table1` (
  `Id` int(10) NOT NULL AUTO_INCREMENT,
  `Data_ID` varchar(10) NOT NULL,
  PRIMARY KEY (`Id`),
  UNIQUE KEY `Id` (`Id`,`Data_ID`),
  UNIQUE KEY `Data_ID` (`Data_ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4389 ;


CREATE TABLE IF NOT EXISTS `Table2` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Data_ID` varchar(10) NOT NULL,
  `IP` varchar(20) NOT NULL,
  `Vote_ID` int(4) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2314 ;

谢谢!

编辑:

这是我的尝试,但我并没有真正收到随机帖子。

SELECT newTable.*
FROM (    
      SELECT Table1.Id, Table1.Data_ID FROM Table1
      LEFT OUTER JOIN Table2
      ON Table1.Data_ID = Table2.Data_ID
      WHERE Table2.Data_ID IS null
     ) as newTable
WHERE newTable.Id >= ROUND( RAND() * (SELECT MAX(Id) FROM Table1)) LIMIT 1;

最佳答案

你把事情搞得太复杂了:带有 EXISTS 的子查询就足够了。

SELECT
    Table1.Id,
    Table1.Data_ID
FROM
    Table1
WHERE
    NOT EXISTS(
        SELECT * FROM Table2 WHERE Table2.Data_ID = Table1.Data_ID
    )
ORDER BY
    RAND()
LIMIT
    1;

这是DESCRIBE结果:

******************** 1. row *********************
           id: 1
  select_type: PRIMARY
        table: Table1
         type: index
possible_keys: 
          key: Data_ID
      key_len: 32
          ref: 
         rows: 1
        Extra: Using where; Using index; Using temporary; Using filesort
******************** 2. row *********************
           id: 2
  select_type: DEPENDENT SUBQUERY
        table: Table2
         type: ALL
possible_keys: 
          key:
      key_len: 
          ref: 
         rows: 1
        Extra: Using where

UPDv1:如果您喜欢JOIN时尚,还有另一种快速方法:

SELECT
    Table1.Id,
    Table1.Data_ID
FROM
    Table1 LEFT OUTER JOIN Table2 USING(Data_ID)
WHERE
    Table2.Id IS NULL
ORDER BY
    RAND()
LIMIT
    1;

描述结果:

******************** 1. row *********************
           id: 1
  select_type: SIMPLE
        table: Table1
         type: index
possible_keys: 
          key: Data_ID
      key_len: 32
          ref: 
         rows: 1
        Extra: Using index; Using temporary; Using filesort
******************** 2. row *********************
           id: 1
  select_type: SIMPLE
        table: Table2
         type: ALL
possible_keys: 
          key: 
      key_len: 
          ref: 
         rows: 1
        Extra: Using where; Not exists; Using join buffer (Block Nested Loop)

关于php - 从 Table1 中选择一个随机行,其中 id 在 Table2 中不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18813591/

相关文章:

PHP - 搜索特定文件的目录和子目录?

javascript - 如何在 Controller 中动态创建http post语句

php - MySQL 自动增量更新

mysql - 从不同的相关记录组中选择两列之一中包含重复值的所有行

java - 关于 jpa/hibernate subselect 获取的询问

php - 显示除第 1 行以外的所有行

php - 将 mysql_connect 更改为 mysqli 导致功能失败

javascript - 如何使用 PHP 中的 ID 数组从 mysql 表中删除多行

提取新记录的sql查询

mysql - SQL 查询处理 NULL