2012-11-10 143 views
2

我有一张表,其中列出了名称列表中的第一个和最后一个列。因此,名为“经理”的专栏可能具有“John Doe”的价值。我想纠正一个查询,只需遍历此表中的每一行,并显示“manager”列的第一个字母和最后一个名称。我所做的每件事都会提出“子查询返回多行”。MySQL子查询 - 返回多于一行

先发小,我刚刚决定放弃第一个字母:

SELECT id, LEFT((SELECT manager FROM my_table), 1) FROM my_table; 

还是我对这个

回答

2

只是完全关闭基地您使用子查询读取到的领域父查询。因此,子查询只能返回一行。这样想:结果集是一个二维结构。一系列的列和行。子查询返回的数据必须与它返回的事物的物理约束匹配。

由于您正在进入一个字段,这意味着一个SINGLE值。如果允许返回多个值,则实际上会试图将2D结果集变成3D集(行+列以及从这些字段中的一个字段生长出的摩天大楼)。

您的查询并不需要一个子查询都:

SELECT id, LEFT(manager, 1) AS first_letter FROM yourtable 

而且,不,如果你想独立姓氏和名字,你会过得更好存储这些都是不同的领域。从一组第一/姓氏字段重建一个名字是很容易的,但是非常难以可靠地将整体名字分隔成单独的姓和名,例如,

simple: 
    John Doe (fn: john, ln: doe) 
hard: 
    Billy Jo Todd (is that "Billy" and "Jo Todd", "Billy" and "Todd" with middle name Jo? 

dead simple: 

    field firstname = John 
    field lastname = Doe 
+0

好家伙,这是梦幻般的。我不知道为什么我要比原本更难。这是一个很好的答案!这是我现在的查询: SELECT DISTINCT sponsor,CONCAT(LEFT(sponsor,1),SUBSTRING(sponsor,(LOCATE(“,sponsors)+ 1)))AS First_Character FROM importReviewInfo; – CodeMoto

0

您必须添加一个条件,你的子查询返回你想如果你想使用子查询像

SELECT manager FROM my_table WHERE id = 1 
1

比较在行,这查询的工作,你就打算,虽然我我不确定这是在任何情况下进行的最佳方式。我们需要更多的信息来说明您的需求。

SELECT 
    m1.id, 
    m2.manager 

FROM 
    my_table AS m1 INNER JOIN 
    (SELECT id, LEFT(manager, 1) AS manager FROM my_table) as m2 
    ON m1.id = m2.id 

http://sqlfiddle.com/#!2/9c395/6