2

Table1 の Data_ID が Table2 に存在しない、Table1 から 1つのランダムな行を選択しようとしています。

投稿 (画像) に投票できるサイトを構築しています。このページでは、投票されていない投稿のみが表示されます。

これが私の2つのテーブルの簡単な構造です:

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;
4

3 に答える 3

2

あなたは物事を複雑にしすぎています: subquery withEXISTSで十分です。

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;

DESCRIBE結果:

******************** 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)
于 2013-09-15T14:47:55.397 に答える
0

Table2 にない Table1 の行を取得し、乱数を並べて最初のレコードを取得します。

内部クエリの使用

SELECT *
FROM Table1 t1 
WHERE t1.Data_ID NOT IN ( SELECT t2.Data_ID FROM Table2 t2)
ORDER BY FLOOR(RAND()*MAX(Id)) 
LIMIT 1

または存在しないを使用

SELECT *
FROM Table1 t1 
WHERE NOT EXISTS ( SELECT t2.Data_ID FROM Table2 t2 WHERE t2.Data_ID = t1.Data_ID)
ORDER BY FLOOR(RAND()*MAX(t1.Id)) 
LIMIT 1

または左結合の使用

SELECT *
FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.Data_ID = t2.Data_ID
WHERE t2.ID IS NULL
ORDER BY FLOOR(RAND()*MAX(t1.Id)) 
LIMIT 1

テーブルに大量のデータがない場合は、ランダム データを取得するためFLOOR(RAND()*MAX(Id))だけに置き換えることができます。RAND()実際、RAND()always を使用しても問題ありません。

于 2013-09-15T14:47:53.197 に答える
0
SELECT * FROM table1 t1 
LEFT JOIN table2 t2 ON (t1.id=t2.id AND t1.data_id<>t2data_id) 
WHERE id=(SELECT id FROM table1 ORDER BY RAND() LIMIT 1)
于 2013-09-15T14:48:15.853 に答える