2011-10-05 25 views
-2

我提出了这个查询,我无法弄清楚为什么chal_rews.rewards字段中的字符数为37的字段返回的字符超过400个字符。mysql结果的长度

SELECT 
GROUP_CONCAT(users.email) AS group_emails, 
GROUP_CONCAT( 
CONCAT(
IFNULL(users.first_name,users.email),' ',IFNULL(users.last_name,''),'|', 
IFNULL(users.facebook_id,''),'|', 
IFNULL(users.email,''),'|', 
users.id,'|', 
invitations.wined,'|', 
invitations.accepted,'|', 
invitations.id 
) 
) AS participants, 
owner.id AS owner_id, 
owner.email, 
owner.facebook_id, 
owner.access_token, 
owner.first_name, 
CONCAT( IFNULL(owner.first_name,owner.email),' ',IFNULL(owner.last_name,'') ) AS owner_fullname, 
challenges.id AS challenge_id, 
challenges.challenge_type_id, 
challenges.period_id, 
challenges.period_amount, 
challenges.category_item_id, 
challenges.metric_amount, 
challenges.owner_user_id, 
CASE 
WHEN challenges.status=2 THEN 'complete' 
WHEN (challenges.status=1 AND challenges.end_date<NOW()) THEN 'waiting_for_winner' 
ELSE challenges.status 
END AS status, 
DATE_FORMAT(challenges.start_date,'%d %M %Y @ %H:%i') AS start_date, 
DATE_FORMAT(challenges.end_date,'%d %M %Y @ %H:%i') AS end_date, 
DATE_FORMAT(challenges.created_at,'%d %M %Y @ %H:%i') AS created_at, 
DATE_FORMAT(challenges.updated_at,'%d %M %Y @ %H:%i') AS updated_at, 
challenges.inform, 
chal_rews.rewards, 
chal_rews.reward_names AS reward_name, 
category_items.item_name, 
LOWER(CONCAT(fixed_verb,' ',IF(metric_amount=-1,'',CONCAT(metric_amount,' ')),fixed_metric,' ',fixed_text,' ',challenges.period_amount ,' ',periods.name)) AS challenge_string 
FROM 
invitations 
Left Join users ON invitations.user_id = users.id 
Left Join challenges ON invitations.challenge_id = challenges.id 
Left Join users AS owner ON owner.id = challenges.owner_user_id 
Left Join challenge_types ON challenges.challenge_type_id = challenge_types.id 
Left Join periods ON challenges.period_id = periods.id 
Left Join category_items ON challenges.category_item_id = category_items.id 
Left Join (

SELECT 
chal_rews.id, 
chal_rews.challenge_id, 
chal_rews.reward_item_id, 
chal_rews.user_id, 
chal_rews.created_at, 
chal_rews.updated_at, 
GROUP_CONCAT(CONCAT(
IFNULL(users.first_name,users.email),' ',IFNULL(users.last_name,''),'|', 
IFNULL(users.facebook_id,''),'|', 
IFNULL(users.access_token,''),'|', 
IFNULL(users.email,''),'|', 
users.id,'|', 
IFNULL(chal_rews.id,' '),'|', 
IFNULL(chal_rews.reward_item_id,' '),'|', 
IFNULL(reward_items.name,' ') 
)) AS rewards, 
GROUP_CONCAT(reward_items.name) AS reward_names 
FROM 
chal_rews 
Left Join users ON users.id = chal_rews.user_id 
Left Join reward_items ON reward_items.id = chal_rews.reward_item_id 
GROUP BY 
chal_rews.challenge_id 

) AS chal_rews ON challenges.id = chal_rews.challenge_id 
WHERE 1=1 

而如果我运行查询的只有这部分奖励,然后返回现场正是它应该充满即连接字符串。

SELECT 
    chal_rews.id, 
    chal_rews.challenge_id, 
    chal_rews.reward_item_id, 
    chal_rews.user_id, 
    chal_rews.created_at, 
    chal_rews.updated_at, 
    GROUP_CONCAT(CONCAT(
    IFNULL(users.first_name,users.email),' ',IFNULL(users.last_name,''),'|', 
    IFNULL(users.facebook_id,''),'|', 
    IFNULL(users.access_token,''),'|', 
    IFNULL(users.email,''),'|', 
    users.id,'|', 
    IFNULL(chal_rews.id,' '),'|', 
    IFNULL(chal_rews.reward_item_id,' '),'|', 
    IFNULL(reward_items.name,' ') 
    )) AS rewards, 
    GROUP_CONCAT(reward_items.name) AS reward_names 
    FROM 
    chal_rews 
    Left Join users ON users.id = chal_rews.user_id 
    Left Join reward_items ON reward_items.id = chal_rews.reward_item_id 
    GROUP BY 
    chal_rews.challenge_id 

我无法弄清楚什么是错的。 SOS PLZ ...

+0

你能告诉我们你希望我们找到'37号线'吗? – Mob

+0

你可以在查询中搜索chal_rews.rewards ..是否有开发人员在回答之前将粘贴代码复制到他们的编辑器中?这就是为什么我提到第37行... :) – mysterious

+0

任何人plzzzzzzzzz ???? – mysterious

回答

0

平底船这一点,但它可能有所帮助。如果没有,那么,对不起!通过在chal_rews子选择结束时收紧group by子句,您可能会获得一些快乐。因此:

SELECT 
chal_rews.id, 
chal_rews.challenge_id, 
chal_rews.reward_item_id, 
chal_rews.user_id, 
chal_rews.created_at, 
chal_rews.updated_at, 
GROUP_CONCAT(CONCAT(
IFNULL(users.first_name,users.email),' ',IFNULL(users.last_name,''),'|', 
IFNULL(users.facebook_id,''),'|', 
IFNULL(users.access_token,''),'|', 
IFNULL(users.email,''),'|', 
users.id,'|', 
IFNULL(chal_rews.id,' '),'|', 
IFNULL(chal_rews.reward_item_id,' '),'|', 
IFNULL(reward_items.name,' ') 
)) AS rewards, 
GROUP_CONCAT(reward_items.name) AS reward_names 
FROM 
chal_rews 
Left Join users ON users.id = chal_rews.user_id 
Left Join reward_items ON reward_items.id = chal_rews.reward_item_id 
GROUP BY 
chal_rews.id, 
chal_rews.challenge_id, 
chal_rews.reward_item_id, 
chal_rews.user_id, 
chal_rews.created_at, 
chal_rews.updated_at 

这是一个有点棘手,以确保没有在我面前的实际表和数据,但我认为,如果你这样做,你会得到一个更加一致的结果回报领域。我认为当您将它作为主查询的一部分运行时,与在单独运行时相比,子选择中返回的列不一致。我猜想这是由于MySQL为chal_rews.user_id和chal_rews.reward_item_id选择了一个值(这反过来被用于外连接到用户和reward_items表 - 因此带回不一致的数据)而引起的。更正式地说,我认为当排除SELECT中存在的GROUP BY中的非聚合列时,您会得到一个不确定的结果集。

祝你好运,发布你如何继续!