2015-05-23 96 views
0

我有兩個表,用戶和主題。使用select時子查詢返回多於1行的mysql

表用戶

CREATE TABLE IF NOT EXISTS `user` (
    `userid` int(11) NOT NULL AUTO_INCREMENT, 
    `usertype` int(11) DEFAULT '0', 
    `useraccesskey` varchar(80) DEFAULT NULL, 
    `userphone` varchar(80) DEFAULT NULL, 
    `userpassword` varchar(80) DEFAULT NULL, 
    `usernickname` varchar(80) DEFAULT NULL, 
    `userphoto` varchar(80) NOT NULL, 
    PRIMARY KEY (`userid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

表話題

CREATE TABLE IF NOT EXISTS `topic` (
`topicid` int(11) NOT NULL AUTO_INCREMENT, 
`btid` int(11) NOT NULL, 
`topictitle` varchar(80) NOT NULL, 
`topiccontent` text NOT NULL, 
`topicisdel` int(11) NOT NULL, 
`topicdate` varchar(80) NOT NULL, 
`authorid` int(11) NOT NULL, 
`useraccesskey` varchar(80) NOT NULL DEFAULT '0', 
`topicistop` int(11) NOT NULL DEFAULT '0', 
`topicishot` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`topicid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1605 ; 

我用這個SQL查詢來列出所有相關信息

select b.*, (select userphoto from user u where u.useraccesskey = b.useraccesskey) as headpic, (select usernickname from user u where u.useraccesskey = b.useraccesskey) as nickname from topic b where b.topicisdel = 0 and b.btid = 3 order by b.topicistop desc, b.topicishot desc, b.topicid desc" 

但結果告訴我Subquery returns more than 1 row,但我檢查了所有的相關信息,沒有,我不知道爲什麼,請幫助我,謝謝。

+0

你的意思是說沒有記錄,但它說有更多的記錄在那裏? –

+0

@anantkumarsingh對不起,我的意思是有一些記錄,但不一樣,我不知道爲什麼,謝謝。 – pidan

+0

你究竟想要做什麼以及結果如何,目前尚不清楚。 –

回答

0

所以它看起來像你的東西更多類似這樣的後 - 儘管沒有數據集和結果集,它總是愚蠢很難確定......

select b.* 
    , u.userphoto headpic 
    , u.usernickname nickname 
    from topic b 
    join user u 
    on u.useraccesskey = b.useraccesskey 
where b.topicisdel = 0 
    and b.btid = 3 
order 
    by b.topicistop desc 
    , b.topicishot desc 
    , b.topicid desc 
+0

非常感謝。 – pidan

0

SELECT列表中子查詢返回的行數不止一個。 MySQL只能處理該上下文中的一個標量值,所以我們必須保證子查詢不會返回兩行或更多行。

避免錯誤的「快速修復」是在每個子查詢上添加一個限制1,以便它返回最多一行。

我也推薦ORDER BY使結果更確定。我們沒有看到user表中包含的其他列,因此我只是引用了由SELECT返回的列。

例如:

SELECT b.* 
    , (SELECT u.userphoto 
      FROM user u 
      WHERE u.useraccesskey = b.useraccesskey 
      ORDER BY 1 LIMIT 1    -- return at most one row 
     ) AS headpic 
    , (SELECT u.usernickname 
      FROM user u 
      WHERE u.useraccesskey = b.useraccesskey 
      ORDER BY 1 LIMIT 1    -- return at most one row 
     ) AS nickname 
    FROM topic b 
WHERE b.topicisdel = 0 
    AND b.btid = 3 
ORDER 
    BY b.topicistop DESC 
    , b.topicishot DESC 
    , b.topicid DESC 

我不認爲這是「最好」的解決問題的辦法。我試圖解釋是什麼導致了這個問題,以及一種解決方法。

要看到那裏的返回多行,我們可以添加其它子查詢的SELECT列表...

 , (SELECT u.userphoto 
      FROM user u 
      WHERE u.useraccesskey = b.useraccesskey 
      ORDER BY 1 LIMIT 1,1    -- return value from 2nd row if it exists 
     ) AS headpic_2 

如果userphoto可以爲NULL,可能沒有給我們太多的指示,因爲我們將無法區分來自行的NULL返回或由於行不存在而返回的NULL。

我們可以得到在SELECT列表中的其他子查詢匹配的用戶行數:

 , (SELECT COUNT(*) 
      FROM user u 
      WHERE u.useraccesskey = b.useraccesskey 
     ) AS count_matching_rows_in_user 

注意useraccesskey列不能保證是獨一無二的user。如果沒有這個保證,我們必須期待可能存在重複的值,也就是user中的多個行具有相同的值useraccesskey

相關問題