【问题标题】:MYSQL - SELECT AS alias to be used in subqueryMYSQL - SELECT AS 别名用于子查询
【发布时间】:2013-02-12 16:23:36
【问题描述】:

我希望能够使用我在子查询中进一步选择的项目之一。 正如您在此示例中看到的,我已将相关“变量”设置为 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

【问题讨论】:

  • 您能否提供有关表格结构和示例的更多信息?你想要的结果是什么。一个 prima vista 我认为这只有在您喜欢使用 PHP 或其他语言来插入动态变量时才有可能。如果动态数字不在表中并且 MySQL 无法生成它,则您将需要另一种中间编程语言来执行此操作。
  • 为什么您没有在上一个问题中询问更多信息? stackoverflow.com/questions/14833940/…
  • 这个问题已经得到解答,这是一个完全不同的问题。我认为这些信息都不是必需的,您可以通过阅读上述内容来了解​​所需的结果。

标签: mysql select subquery


【解决方案1】:

我不确定我是否理解您的问题,但 NOT EXISTS 的工作方式与 LEFT JOIN 和 IS NULL 一样。所以我认为这会起作用:

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

这里是SQL Fiddle

【讨论】:

  • 嘿。抱歉,这很难解释,但我基本上需要能够在以后的子查询中使用第二个菜鸟。有没有办法这样做。此建议不适用于查询的整体目的。
  • @Andre -- 我认为您不能在子查询中使用这样的变量 -- 取决于您的确切需求。可能是这样的:sqlfiddle.com/#!2/e2ede/8——然后你就可以访问新的列 noob。祝你好运。
  • 在赋值给一个数字后,是否不能以任何方式将其设置为变量?似乎应该有一个简单的方法来做到这一点:z
【解决方案2】:

我认为最安全的方法是在子查询中定义这些。我通常给它 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 特定的。

【讨论】:

  • 嘿。这项工作然而 100 只是在那里填充一个我不知道的变量,直到调用查询。所以我需要像这样使用查询的开头部分... INSERT INTO users_friends (userId,friendId) (SELECT 77, id FROM users WHERE email = 'c@c.com')
  • 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 andfriendId = (SELECT id FROM users WHERE email = 'a@g.com')) LIMIT 1
【解决方案3】:

编辑

我建议您更改表结构。

    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。

【讨论】:

  • 问题是在拉取查询之前我不知道朋友 ID。我在选择部分得到它,然后我需要在子查询中使用它。不过还是谢谢。
  • @Andre 几个问题你知道用户 ID 吗?是否有包含朋友姓名的列?这是friendID列中的朋友姓名吗?
  • 嘿,朋友栏里没有名字。不过我确实知道用户 ID,
  • Strange in Fiddle 它有效。那么,是否改变了 mysql 数据库中的数据结构?尝试这样做:INSERT INTO users_friends VALUES (2,1);,然后是查询。 sqlfiddle.com/#!2/0b035
  • @Andre 最重要的变化是:primary key (userid, friendid) 表 users_friends。它为您的 table_friends 创建一个复合键。如果您已经有主键,则可以添加此 unique(userid, friendid)
【解决方案4】:
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

【讨论】:

  • 最后一部分的子查询找到了我需要检查的 id。不知道为什么我花了这么长时间才意识到!
猜你喜欢
  • 2019-03-09
  • 1970-01-01
  • 2011-08-18
  • 2014-10-13
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
相关资源
最近更新 更多