mysql SELECT以开头的任何行(来自select语句的多个值)

q5iwbnjs  于 2023-05-16  发布在  Mysql
关注(0)|答案(2)|浏览(181)

我使用C#和MySQL服务器,我有两个这样的表:
表1

+--------+----------------------+-----------+----------------+
| aut_id | aut_name             | country   | home_city      |
+--------+----------------------+-----------+----------------+
| AUT001 | William Norton       | UK        | Cambridge      |
| AUT002 | William Maugham      | Canada    | Toronto        |
| AUT003 | William Anthony      | UK        | Leeds          |
| AUT004 | S.B.Swaminathan      | India     | Bangalore      |
| AUT005 | Thomas Morgan        | Germany   | Arnsberg       |
| AUT006 | Thomas Merton        | USA       | New York       |
| AUT007 | Piers Gibson         | UK        | London         |
| AUT008 | Nikolai Dewey        | USA       | Atlanta        |
| AUT009 | Marquis de Ellis     | Brazil    | Rio De Janerio |
| AUT010 | Joseph Milton        | USA       | Houston        |
| AUT011 | John Betjeman Hunter | Australia | Sydney         |
| AUT012 | Evan Hayek           | Canada    | Vancouver      |
| AUT013 | E. Howard            | Australia | Adelaide       |
| AUT014 | C. J. Wilde          | UK        | London         |
| AUT015 | Butler Andre         | USA       | Florida        |
+--------+----------------------+-----------+----------------+

表2

+--------+-----+
| ID | PreFix  |
+--------+-----+
| 1  | Wi      |
| 2  | Th      |
| 3  | E       |
+--------+-----+

我想从table_2中选择一个名字以任意前缀开头的作者,结果如下:

+--------+----------------------+-----------+----------------+
| aut_id | aut_name             | country   | home_city      |
+--------+----------------------+-----------+----------------+
| AUT001 | William Norton       | UK        | Cambridge      |
| AUT002 | William Maugham      | Canada    | Toronto        |
| AUT003 | William Anthony      | UK        | Leeds          |
| AUT005 | Thomas Morgan        | Germany   | Arnsberg       |
| AUT006 | Thomas Merton        | USA       | New York       |
| AUT012 | Evan Hayek           | Canada    | Vancouver      |
| AUT013 | E. Howard            | Australia | Adelaide       |
+--------+----------------------+-----------+----------------+

我尝试了这个解决方案:
SELECT * FROM table_1 where aut_name like concat((SELECT PreFix FROM table_2),' %');
但我得到这个错误消息:
错误代码:1242子查询返回1个以上的行

b0zn9rqh

b0zn9rqh1#

尝试使用JOIN而不是子查询:

SELECT t1.aut_id, t1.aut_name, t1.country, t1.home_city
FROM table_1 AS t1
JOIN table_2 AS t2 ON t1.aut_name LIKE CONCAT(t2.PreFix, '%');

SQL CONCAT函数旨在将多个字符串连接为单个字符串,将单个字符串值作为参数并将它们组合在一起。CONCAT期望单个标量值作为参数,而不是子查询可能返回的多行结果集
要解决类似于您在这里提出的问题,您需要利用JOIN的强大功能,该语句允许您根据不同表之间的相关列(通常称为外键)合并不同表中的行。这样,您可以确保table_1中的每一行都与table_2中具有匹配PreFix值的所有行进行比较,这是一个可以在ON子句之后指定的条件。
附带说明一下,如果您提供SQL的DDL和DML语句来构建测试用例和进行测试所需的最小可重现示例,我们将非常感激。我冒昧地创建了这些声明,所以我将在这里发布它们,以帮助任何人稍后来了解,玩,测试和改进我们的工作:

CREATE TABLE table_1 (
  aut_id VARCHAR(10),
  aut_name VARCHAR(50),
  country VARCHAR(50),
  home_city VARCHAR(50)
);

CREATE TABLE table_2 (
  ID INT,
  PreFix VARCHAR(2)
);

INSERT INTO table_1 (aut_id, aut_name, country, home_city)
VALUES
  ('AUT001', 'William Norton', 'UK', 'Cambridge'),
  ('AUT002', 'William Maugham', 'Canada', 'Toronto'),
  ('AUT003', 'William Anthony', 'UK', 'Leeds'),
  ('AUT004', 'S.B.Swaminathan', 'India', 'Bangalore'),
  ('AUT005', 'Thomas Morgan', 'Germany', 'Arnsberg'),
  ('AUT006', 'Thomas Merton', 'USA', 'New York'),
  ('AUT007', 'Piers Gibson', 'UK', 'London'),
  ('AUT008', 'Nikolai Dewey', 'USA', 'Atlanta'),
  ('AUT009', 'Marquis de Ellis', 'Brazil', 'Rio De Janerio'),
  ('AUT010', 'Joseph Milton', 'USA', 'Houston'),
  ('AUT011', 'John Betjeman Hunter', 'Australia', 'Sydney'),
  ('AUT012', 'Evan Hayek', 'Canada', 'Vancouver'),
  ('AUT013', 'E. Howard', 'Australia', 'Adelaide'),
  ('AUT014', 'C. J. Wilde', 'UK', 'London'),
  ('AUT015', 'Butler Andre', 'USA', 'Florida');

INSERT INTO table_2 (ID, PreFix)
VALUES
  (1, 'Wi'),
  (2, 'Th'),
  (3, 'E');
gopyfrb3

gopyfrb32#

您收到的错误消息"Subquery returns more than 1 row"指示子查询(SELECT PreFix FROM table_2)返回多行,因此不能用作CONCAT()函数中的参数。
要解决这个问题,可以使用IN运算符而不是LIKE来比较table_2的前缀和table_1.aut_name的开头。

SELECT *
FROM table_1
WHERE aut_name LIKE CONCAT((SELECT PreFix FROM table_2 WHERE ID = 1), '%')
   OR aut_name LIKE CONCAT((SELECT PreFix FROM table_2 WHERE ID = 2), '%')
   OR aut_name LIKE CONCAT((SELECT PreFix FROM table_2 WHERE ID = 3), '%');

或者,您可以使用JOIN语句来实现相同的结果。下面是使用JOIN的代码:

SELECT t1.*
FROM table_1 t1
JOIN table_2 t2 ON t1.aut_name LIKE CONCAT(t2.PreFix, '%');

这段代码选择table_1中的所有行,其中aut_nametable_2中的任何前缀开头。

相关问题