0

サブクエリでさらに下に選択しているアイテムの1つを使用できるようにしたいと思います。この例でわかるように、問題の「変数」を100に設定しましたが、実際にはこれは動的な数値になるため、サブクエリでアクセスできる必要があります。

INSERT INTO users_friends (userId, friendId) 
SELECT 77, id as noob
FROM users WHERE email = 'a@g.com' 
AND
NOT EXISTS (SELECT * FROM users_friends
WHERE userId = 77 and friendId = noob)
LIMIT 1
4

4 に答える 4

2

あなたの質問を完全に理解できるかどうかはわかりませんが、NOTEXISTSはLEFTJOINと同じように機能し、ISNULLです。だから私はこれがうまくいくと思います:

SELECT 77, @noob
FROM users u
  JOIN (SELECT @noob:= 100) r
  LEFT JOIN users_friends uf on u.userid = uf.userid and uf.friendid = @noob
WHERE email = 'a@g.com' 
  AND uf.userid IS NULL

そして、これがSQLFiddleです。

于 2013-02-12T16:35:53.383 に答える
0

編集

テーブル構造を変更することをお勧めします。

    CREATE TABLE users_friends(
userid int, 
friendid int,
primary key (userid, friendid)
);

CREATE TABLE users (
 userid int primary key, 
 email varchar(100), 
 name VARCHAR (100),
 index (email,name)
);


INSERT INTO users VALUES (1, 'a@g.com', 'noob'), (2,'b@g.com', 'Joe');


INSERT INTO users_friends (userId, friendId) 
VALUES (2, (SELECT userId 
FROM users 
WHERE email = 'a@g.com' 
AND name = "noob"
AND NOT exists (SELECT * FROM users_friends as uf 
            JOIN users as u 
            ON u.userid = uf.userid 
            where uf.friendid = 2 AND name = "noob"            
           )
           ) 
       );

SQL FIDDLE DEMO

これを試して:

    <?php

    function select_query ($userid,$friendname, $email){
    $host = "host";
    $user = "username";
    $password = "password";
    $database = "database name";

    // open connection to databse
    $link = mysqli_connect($host, $user, $password, $database);
            IF (!$link){
                echo ("Unable to connect to database!");
            }
            ELSE {
               //Is someone registered at other conference from table registration
               $query = "    INSERT INTO users_friends (userId, friendId) 
VALUES (".$userId.", (SELECT userId 
FROM users 
WHERE email = '".$email."' 
AND name = '".$friendname."'
AND NOT exists (SELECT * FROM users_friends as uf 
            JOIN users as u 
            ON u.userid = uf.userid 
            where uf.friendid = ".$userId." AND name = '"$friendname"'            
           )
           ) 
       )"; 
               $result = mysqli_query($link, $query);
               return $query;
               return $result;
            }
            mysqli_close($link);
    }

    echo select_query(1,noob,'a@g.com');
   ?>

私が上で述べたように、私はあなたが何を意味するのかわかりません。変数の値を変更できるという意味で動的を意味する場合、これが役立つ場合があります。以前の投稿では、PHPを使用していました。だから、私の推測では、あなたはPHPを使用していると思います。

于 2013-02-12T16:52:32.690 に答える
0

最も安全なアプローチは、サブクエリでこれらを定義することだと思います。私は通常これにconstのエイリアスを与えます:

INSERT INTO users_friends (userId, friendId) 
    SELECT const.userId, const.noob
    FROM users cross join
         (select 77 as userId, 100 as noob) const
    WHERE email = 'a@g.com' AND
          NOT EXISTS (SELECT *
                      FROM users_friends
                      WHERE userId = const.userId and friendId = const.noob
                     )
    LIMIT 1

SGeddesのアプローチは、クエリの範囲外の変数の正しい評価に依存しているため、私は懸念しています。これはこの場合は機能するかもしれませんが、クエリが外部変数に依存しないソリューションを好みます。ちなみに、これはどのデータベースでも機能するはずであり、MySQL固有ではありません。

于 2013-02-12T16:54:18.160 に答える
-1
INSERT INTO users_friends (userId, friendId) 
SELECT 77, id 
FROM users WHERE email = 'a@g.com' 
AND
NOT EXISTS (SELECT * FROM users_friends
WHERE userId = 77 and friendId = (SELECT id 
FROM users WHERE email = 'a@g.com'))
LIMIT 1
于 2013-02-12T19:13:59.590 に答える