2013-02-09 2 views
1

Я новичок в функциях MySQL. Меня озадачивает «Subquery возвращает более 1 строки» ошибки для ниже простого случая.«Подзапрос возвращает ошибку более одной строки» для простого случая

Это моя функция.

mysql> create function UserLNFromUsername (username VARCHAR(20)) 
     RETURNS VARCHAR(30) 
     return (select last_name from users where username = 'steve'); 
Query OK, 0 rows affected (0.00 sec) 

Это ошибка, с которой я сталкиваюсь.

mysql> select UserLNFromUsername('steve'); 
ERROR 1242 (21000): Subquery returns more than 1 row 

Это результат запроса, который возвращает только одну строку.

mysql> select last_name from users where username = 'steve'; 
+-----------+ 
| last_name | 
+-----------+ 
| Goldstein | 
+-----------+ 
1 row in set (0.00 sec) 
+3

Пожалуйста, положить немного больше усилий, задавая свой вопрос. –

ответ

-1

Ваша функция должна возвращать строку. Этот запрос:

select last_name from users where username = 'steve' 

возвращает более одной записи. Поэтому ваша функция не знает, что делать. Он не может преобразовать несколько записей в одну строку.

Что вы делаете, это зависит от того, чего вы пытаетесь достичь.

+0

, хотя перед редактированием вопрос не был ясен, он показывает, что этот запрос возвращает 1 запись – wimh

2

ваша функция использует username дважды;

mysql> create function UserLNFromUsername (username VARCHAR(20)) 
     RETURNS VARCHAR(30) 
     return (select last_name from users where username = 'steve'); 

используется UserLNFromUsername('steve'), поэтому, когда запрос будет where 'steve' = 'steve', поэтому он будет возвращать все записи из таблицы.

Я бы предложил переименовать параметр, например:

mysql> create function UserLNFromUsername (requestedusername VARCHAR(20)) 
     RETURNS VARCHAR(30) 
     return (select last_name from users where username = 'steve'); 

Но вы, вероятно, хотите, чтобы использовать эту функцию:

mysql> create function UserLNFromUsername (requestedusername VARCHAR(20)) 
     RETURNS VARCHAR(30) 
     return (select last_name from users where username = requestedusername); 
Смежные вопросы