длина результата mysql

#mysql

#mysql

Вопрос:

Я сделал этот запрос, и я не могу понять, почему количество символов в поле chal_rews.rewards в строке 37 возвращает ровно 341 символ, где более 400 символов.

 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
  

в то время как, если я выполняю только эту часть запроса, поле rewards возвращает именно то, что должно, т.Е. Полную объединенную строку.

  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
  

Я не могу понять, что не так. Пожалуйста, пожалуйста…

Комментарии:

1. Можете ли вы сказать нам, как вы хотите, чтобы мы определили местоположение Line 37 ?

2. вы можете выполнить поиск chal_rews.rewards в запросе .. есть разработчики, которые копируют вставляют код в свой редактор перед ответом .. вот почему я упомянул строку 37 … 🙂

Ответ №1:

Это немного сложно, но это может помочь. Если этого не произойдет, тогда, ну, извините! Вы можете получить некоторую радость, ужесточив предложение group by в конце вложенного выбора chal_rews. Следовательно:

 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 (которые, в свою очередь, используются для внешнего соединения с таблицами users и reward_items, что приводит к возврату противоречивых данных). Более формально я считаю, что вы получаете неопределенный набор результатов при исключении неагрегированных столбцов из ГРУППЫ BY, которые присутствуют в ВЫБОРЕ.

Удачи и сообщайте, как у вас дела!