2011-10-05 7 views
-2

私はこの質問をしましたが、なぜ文字の数がであるのかわかりません。chal_rews.rewardsフィールドの行37は、400文字を超えるところで正確に341文字を返します。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 

それは私の目の前で実際のテーブルとデータのない確かに少しトリッキーだが、私はあなたがこれを行う場合は、報酬の分野でより一貫性のある結果を得るだろうと思います。私はあなたがメインクエリの一部としてそれを単独で実行するときと比較して実行するとき、サブセレクトに戻ってくる列が矛盾していると思います。私はこれがchal_rews.user_idとchal_rews.reward_item_idの値をMySQLに「選択」させることによって引き起こされたと考えています(ユーザとreward_itemsテーブルへの外部結合に使用されるため、一貫性のないデータが返されます)。より正式には、SELECTに存在する集計されていない列をGROUP BYから除外すると、不確定な結果セットが得られていると思います。

幸運とポストをどうぞ!