【问题标题】:Is it possible to use results from a SELECT statement within another SELECT statement?是否可以在另一个 SELECT 语句中使用 SELECT 语句的结果?
【发布时间】:2011-08-24 18:44:23
【问题描述】:

这是我的代码,但我确定这不是正确的做法。

mysql_query("SELECT * FROM BlockUsers
WHERE OwnerID =
(SELECT ID FROM UserAccounts WHERE Code='$UserCode')
AND
BlockID =
(SELECT ID FROM UserAccounts WHERE Code='$BlockUserCode')
LIMIT 1", $DB)

有人可以帮忙吗?谢谢!

【问题讨论】:

  • 这不行吗?这是一个有效的 SQL 查询。
  • 不,它没有出现错误,但同时没有正确的结果。
  • 感谢大家的帮助!! :D

标签: php mysql select


【解决方案1】:

是的,但是当您进行这样的相等性测试(=、 等...)时,子查询必须返回单个值。否则会是somevalue = [list of result rows],这是没有意义的。

你想要:

SELECT * FROM BlockUsers
WHERE OwnerID IN (SELECT ID FROM UserAccounts WHERE.....)
              ^^--- use 'in' instead of '=';

【讨论】:

    【解决方案2】:
    SELECT * FROM BlockUsers
    WHERE OwnerID IN
    (SELECT ID FROM UserAccounts WHERE Code='$UserCode')
    AND
    BlockID IN
    (SELECT ID FROM UserAccounts WHERE Code='$BlockUserCode')
    LIMIT 1
    

    SELECT * FROM BlockUsers AS bu
    INNER JOIN UserAccounts AS ua1 ON ua1.ID = bu.OwnerID
    INNER JOIN UserAccounts AS ua2 ON ua2.ID = bu.BlockID
    WHERE ua1.Code = '$UserCode' AND ua2.Code = '$BlockUserCode'
    LIMIT 1
    

    我想。我没有对此进行任何测试,但我很确定它已经接近了。

    编辑: 我刚刚注意到您正在使用 MySQL。你肯定想做内部连接而不是子选择。在 MySQL 中,这些子选择将创建没有索引的派生表。在这些派生表中查找 OwnerID 和 BlockID 将对它们进行全表扫描。如果 $UserCode 和 $BlockUserCode 将子选择的结果缩小到单行,这可能无关紧要,但如果它们返回很多行,它确实会减慢您的查询速度。

    【讨论】:

      【解决方案3】:

      您可以直接加入UserAccounts 来获取所需的行,而不是使用子查询。

      SELECT BlockUsers.* FROM BlockUsers
      JOIN UserAccounts as UA1 ON Code='$UserCode' AND OwnerID = UA1.ID
      JOIN UserAccounts as UA2 ON Code='$BlockUserCode' AND BlockID = UA2.ID
      LIMIT 1
      

      【讨论】:

        【解决方案4】:

        是的,你可以,子查询,你可以在这里找到官方的 mysql 参考:http://dev.mysql.com/doc/refman/5.0/en/subqueries.html 从您的查询中,我认为您可以假设您的子查询仅返回 1 个值,或者 @Marc B 点使用 IN 而不是等号。

        【讨论】:

          【解决方案5】:

          尝试使用

          SELECT * FROM BlockUsers, UserAccounts
          WHERE (OwnerID = ID and BlockID=ID and Code in ('$BlockUserCode', '$UserCode')
          LIMIT 1
          

          【讨论】:

          • 您将需要 JOIN UserAccounts 两次,因为 OP 正在请求 2 个不同的行。
          猜你喜欢
          • 2014-02-11
          • 2021-01-05
          • 2017-01-16
          • 1970-01-01
          • 1970-01-01
          • 2016-09-18
          • 1970-01-01
          • 2022-12-31
          • 1970-01-01
          相关资源
          最近更新 更多