【问题标题】:How to get all values that matches with an array of values?如何获取与值数组匹配的所有值?
【发布时间】:2017-01-24 17:06:21
【问题描述】:

我的MySQL 查询有多个过滤器。它将根据某些过滤器从用户那里检索信息。

过滤器由用户选择,因此他们可以过滤多个值。除了其中一个过滤器可以在子查询中返回多行之外,它们都是唯一的。

用户可以过滤的内容:

  • 按名称
  • 按用户国籍

考虑到Name 在这种情况下是唯一的,但可能有多个用户具有相同的国籍。此外,如果没有任何过滤器,则查询应返回所有用户的所有 UserInfo

另外,我面临的问题是信息存储在两个不同的表中。这是结构:

UserInformation                   Users
----------------                ----------                          
ID                               ID
Name                             UserInfo
Nationality

所以我必须获取与相应过滤器匹配的用户的UserInfo。如果我通过Name 进行过滤,我没有任何问题,因为它只能是唯一的,但如果我使用Nationality 作为过滤器,它会给我一个错误。

两个表都通过 ID 连接。

我现在做的是:

SELECT UserInfo FROM Users WHERE 
     ID LIKE (SELECT ID FROM UserInformation WHERE Name='UniqueName') AND 
     ID LIKE (SELECT ID FROM UserInformation WHERE Nationality='Spanish')

当然,如果我尝试通过Nationality 进行过滤,如果有多个值与Nationality 匹配,我可以看到存在问题,因为他们将无法使用超过一个返回ID

我必须注意到我不能修改表的结构,因为我没有足够的权限,我只能查阅它们。

但是,我如何检索与一个、两个或不匹配过滤器的所有用户的 UserInfo(在这种情况下,它将返回所有 UserInfo 值)?

提前致谢!

【问题讨论】:

    标签: mysql


    【解决方案1】:

    加入表格:

    SELECT UserInfo FROM Users
    JOIN UserInformation ON Users.ID = UserInformation.ID
    WHERE Name='UniqueName' 
    AND Nationality='Spanish'
    

    【讨论】:

      【解决方案2】:

      试试这个解决方案

      SELECT UserInfo FROM Users WHERE 
       ID IN ((SELECT ID FROM UserInformation WHERE Name='UniqueName') OR
        (SELECT ID FROM UserInformation WHERE Nationality='Spanish') OR
        (SELECT ID FROM UserInformation WHERE Nationality='Spanish' AND Name='UniqueName'))
      

      【讨论】:

        【解决方案3】:

        您可以创建一个视图,其中包含两个表中的相关列。这将帮助您在一处查找记录。

        CREATE OR REPLACE FORCE VIEW "[Your_Schema]"."USERDETAILS" ("ID", "NAME", "NATIONALITY", "USERINFO") AS 
          SELECT T1.ID,
           T1.NAME,
           T1.NATIONALITY,
           T2.USERINFO,
        FROM   USERINFORMATION T1, USERS T2
        WHERE T2.ID= T1.ID;
        

        然后您可以触发 select 查询来获取所需的记录。

        SELECT USERINFO FROM USERDETAILS WHERE NAME='UniqueName' and Nationality='Spanish';
        

        约束:您需要拥有创建视图的权限。有时不授予表结构修改权限,但您可能被允许创建视图。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-21
          • 1970-01-01
          • 2020-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-11
          • 1970-01-01
          相关资源
          最近更新 更多