GROUP BYエラー
状態:-
閲覧数:972
投稿日:2017-08-17
更新日:2019-01-19
実際に遭遇したエラーメッセージ1
実際に遭遇したエラーメッセージ2
実際に遭遇したエラーメッセージ3
PDO ERROR:SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'データベース名.m.user_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
実際に遭遇したエラーメッセージ2
( ! ) Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'データベース名.res.body' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by in
実際に遭遇したエラーメッセージ3
( ! ) Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'データベース名.res.body' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by in
遭遇例1
エラー対応
修正前
public function Get1ExitpageRankingSession()
{
$query = "
SELECT `user_id`, `visitor_session_id`,`title`, `request_url`, `http_referer`, `user_agent`, `screen_width`, `screen_height`, `access_datetime`,COUNT(*) AS `count` FROM `access` AS m
WHERE `visitor_session_id` != '' AND NOT EXISTS (
SELECT 1
FROM `access` AS s
WHERE m.`visitor_session_id` = s.`visitor_session_id`
AND m.`access_datetime` < s.`access_datetime`
AND m.`access_datetime`>=date(current_timestamp - interval 1 day)
AND m.`access_datetime` < date(now())
GROUP BY m.`request_url`
ORDER BY `count` DESC
";
return $this->executeFetchAll($query);
}
修正後
public function Get1ExitpageRankingSession()
{
$query = "
SELECT ANY_VALUE(`user_id`) AS user_id, `visitor_session_id`,`title`, `request_url`, `http_referer`, `user_agent`, `screen_width`, `screen_height`, `access_datetime`,COUNT(*) AS `count` FROM `access` AS m
WHERE `visitor_session_id` != '' AND NOT EXISTS (
SELECT 1
FROM `access` AS s
WHERE m.`visitor_session_id` = s.`visitor_session_id`
AND m.`access_datetime` < s.`access_datetime`
AND m.`access_datetime`>=date(current_timestamp - interval 1 day)
AND m.`access_datetime` < date(now())
GROUP BY m.`request_url`
ORDER BY `count` DESC
";
return $this->executeFetchAll($query);
}
ANY_VALUE指定しても解決しない場合は?
一旦、ORDER BYをコメントアウトしてみる
・もしかすると不要な指定かも
※「ORDER BY」も、一意かどうかの判定に利用されるため注意が必要
遭遇例2
エラー対応
修正前
public function fetchByParentCategoryid2new($category_id)
{
$sql = "
SELECT
a.id AS id,
a.category_id AS category_id,
a.state_id AS state_id,
a.counter AS counter,
a.created_at AS created_at,
a.modified AS modified,
a.body AS body,
topic_name,
r.modified AS rmodified,
r.body AS rbody,
u.display_name, u.site_id, c.category, c.parent_id,s.situation, s.fonticon,s.color,relationentrynum
FROM
status AS a
LEFT JOIN user u ON a.user_id = u.id
LEFT JOIN category c ON a.category_id = c.category_id
LEFT JOIN state s ON a.state_id = s.state_id
LEFT OUTER JOIN(
SELECT
topic_id,`body`, MAX(modified) AS modified, COUNT(topic_id) AS `relationentrynum`
FROM
res
GROUP BY topic_id
) AS r ON a.id = r.topic_id";
$where = array();
$bind = array();
foreach ($category_id as $val) {
$where[] = 'a.`category_id` = ? ';//単一キーワード
$bind[] = '' . $val . '';
}
$sql .= ' where ' . implode('or ', $where);
$sql .= ' and public = 1 ';
$sql .= 'ORDER BY a.created_at ASC';
return $this->fetchAll($sql, $bind);
}
修正後
ANY_VALUE(`body`)
public function fetchByParentCategoryid2new($category_id)
{
$sql = "
SELECT
a.id AS id,
a.category_id AS category_id,
a.state_id AS state_id,
a.counter AS counter,
a.created_at AS created_at,
a.modified AS modified,
a.body AS body,
topic_name,
r.modified AS rmodified,
r.body AS rbody,
u.display_name, u.site_id, c.category, c.parent_id,s.situation, s.fonticon,s.color,relationentrynum
FROM
status AS a
LEFT JOIN user u ON a.user_id = u.id
LEFT JOIN category c ON a.category_id = c.category_id
LEFT JOIN state s ON a.state_id = s.state_id
LEFT OUTER JOIN(
SELECT
topic_id,ANY_VALUE(`body`) AS body, MAX(modified) AS modified, COUNT(topic_id) AS `relationentrynum`
FROM
res
GROUP BY topic_id
) AS r ON a.id = r.topic_id";
$where = array();
$bind = array();
foreach ($category_id as $val) {
$where[] = 'a.`category_id` = ? ';//単一キーワード
$bind[] = '' . $val . '';
}
$sql .= ' where ' . implode('or ', $where);
$sql .= ' and public = 1 ';
$sql .= 'ORDER BY a.created_at ASC';
return $this->fetchAll($sql, $bind);
}
・セッション系のSQLでエラーが発生。仕組みだけ作成して、クッキー設定していなかったから?
遭遇例3
エラー修正内容
body を ANY_VALUE(`body`) AS body へ修正
エラー修正前
public function fetchByStateid2($state_id)
{
$sql = "
SELECT
a.id AS id,
a.category_id AS category_id,
a.state_id AS state_id,
a.body AS body,
a.created_at AS created_at,
a.modified AS modified,
topic_name,
r.body AS rbody,
r.modified AS rmodified,
u.display_name, u.site_id, c.category, s.situation, s.color,relationentrynum
FROM
status AS a
LEFT JOIN user u ON a.user_id = u.id
LEFT JOIN category c ON a.category_id = c.category_id
LEFT JOIN state s ON a.state_id = s.state_id
LEFT OUTER JOIN(
SELECT
topic_id,body, MAX(modified) AS modified, COUNT(topic_id) AS `relationentrynum`
FROM
res
GROUP BY topic_id
) AS r ON a.id = r.topic_id
WHERE a.state_id =:state_id
AND public = 1
ORDER BY created_at DESC
";
// echo $sql;
return $this->fetchAll($sql, array(
':state_id' => $state_id,
));
}
エラー修正後
public function fetchByStateid2($state_id)
{
$sql = "
SELECT
a.id AS id,
a.category_id AS category_id,
a.state_id AS state_id,
a.body AS body,
a.created_at AS created_at,
a.modified AS modified,
topic_name,
r.body AS rbody,
r.modified AS rmodified,
u.display_name, u.site_id, c.category, s.situation, s.color,relationentrynum
FROM
status AS a
LEFT JOIN user u ON a.user_id = u.id
LEFT JOIN category c ON a.category_id = c.category_id
LEFT JOIN state s ON a.state_id = s.state_id
LEFT OUTER JOIN(
SELECT
topic_id,ANY_VALUE(`body`) AS body, MAX(modified) AS modified, COUNT(topic_id) AS `relationentrynum`
FROM
res
GROUP BY topic_id
) AS r ON a.id = r.topic_id
WHERE a.state_id =:state_id
AND public = 1
ORDER BY created_at DESC
";
// echo $sql;
return $this->fetchAll($sql, array(
':state_id' => $state_id,
));
}
遭遇例4
修正前
public function fetchStatusRelationLastResEntryAll()//レスがない場合、最新一覧日は空欄(RIGHTで逆)
{
// SELECT DISTINCT et.* FROM
// エントリーテーブル et
// LEFT OUTER JOIN エントリー所属カテゴリーテーブル ec
// ON (et.エントリーID = ec.エントリーID)
// WHERE ec.カテゴリーID = 1
$sql = "
SELECT
a.id AS id,
a.category_id AS category_id,
a.project_id AS project_id,
a.domain_id AS domain_id,
a.state_id AS state_id,
a.official_url AS official_url,
a.body AS body,
a.counter AS counter,
a.created_at AS created_at,
a.modified AS modified,
a.topic_name,
z.*,
s.situation,
s.color AS statecolor,
r.modified AS rmodified,
u.display_name,
u.site_id,
c.category,
p.project,
d.domain,
relationentrynum,
GROUP_CONCAT(t.tag) AS tag,
GROUP_CONCAT(t.color) AS tag_color,
GROUP_CONCAT(st.tag_id) AS tag_id,
c.color AS category_color,
p.color AS project_color,
d.color AS domain_color
FROM
status AS a
LEFT JOIN user u ON a.user_id = u.id
LEFT JOIN category c ON a.category_id = c.category_id
LEFT JOIN project p ON a.project_id = p.project_id
LEFT JOIN domain d ON a.domain_id = d.domain_id
LEFT JOIN status_tag st ON (a.id = st.status_id)
LEFT JOIN state s ON a.state_id = s.state_id
RIGHT JOIN tag t ON (t.tag_id = st.tag_id)
LEFT OUTER JOIN(
SELECT
topic_id,MAX(modified) AS modified, COUNT(topic_id) AS `relationentrynum`
FROM
res
GROUP BY topic_id
) AS r ON a.id = r.topic_id
LEFT JOIN(
SELECT
a.category_id, a.category, a.parent_id,
CASE WHEN a.parent_id = 0
then a.fonticon
else b.fonticon
end AS fonticon,
CASE WHEN a.parent_id = 0
then a.color
else b.color
end AS color,
CASE WHEN a.parent_id = 0
then a.category
else b.category
end AS parent_category,
CASE WHEN a.parent_id = 0
then a.category_id
else a.parent_id
end AS parent_id2
FROM
category a
LEFT JOIN
category b on a.parent_id = b.category_id
) AS z ON a.category_id = z.category_id
LEFT JOIN(
SELECT
a.project_id, a.project, a.parent_id,
CASE WHEN a.parent_id = 0
then a.fonticon
else b.fonticon
end AS fonticon,
CASE WHEN a.parent_id = 0
then a.color
else b.color
end AS color,
CASE WHEN a.parent_id = 0
then a.project
else b.project
end AS parent_project,
CASE WHEN a.parent_id = 0
then a.project_id
else a.parent_id
end AS parent_id2
FROM
project a
LEFT JOIN
project b on a.parent_id = b.project_id
) AS x ON a.project_id = x.project_id
LEFT JOIN(
SELECT
a.domain_id, a.domain, a.parent_id,
CASE WHEN a.parent_id = 0
then a.fonticon
else b.fonticon
end AS fonticon,
CASE WHEN a.parent_id = 0
then a.color
else b.color
end AS color,
CASE WHEN a.parent_id = 0
then a.domain
else b.domain
end AS parent_domain,
CASE WHEN a.parent_id = 0
then a.domain_id
else a.parent_id
end AS parent_id2
FROM
domain a
LEFT JOIN
domain b on a.parent_id = b.domain_id
) AS y ON a.domain_id = y.domain_id
WHERE a.public = 1
GROUP BY a.id
ORDER BY GREATEST(a.`modified`,IFNULL(`rmodified`, a.`modified`))DESC, a.`created_at` DESC
";
return $this->fetchAll($sql);
}
JOIN追加したらエラー発生
LEFT JOIN `chronology` chr ON (a.id = chr.status_id)
`chr`.`modified` AS chrmodified,
public function fetchStatusRelationLastResEntryAll()//レスがない場合、最新一覧日は空欄(RIGHTで逆)
{
// SELECT DISTINCT et.* FROM
// エントリーテーブル et
// LEFT OUTER JOIN エントリー所属カテゴリーテーブル ec
// ON (et.エントリーID = ec.エントリーID)
// WHERE ec.カテゴリーID = 1
$sql = "
SELECT
a.id AS id,
a.category_id AS category_id,
a.project_id AS project_id,
a.domain_id AS domain_id,
a.state_id AS state_id,
a.official_url AS official_url,
a.body AS body,
a.counter AS counter,
a.created_at AS created_at,
a.modified AS modified,
a.topic_name,
z.*,
s.situation,
s.color AS statecolor,
r.modified AS rmodified,
u.display_name,
u.site_id,
c.category,
p.project,
d.domain,
`chr`.`modified` AS chrmodified,
relationentrynum,
GROUP_CONCAT(t.tag) AS tag,
GROUP_CONCAT(t.color) AS tag_color,
GROUP_CONCAT(st.tag_id) AS tag_id,
c.color AS category_color,
p.color AS project_color,
d.color AS domain_color
FROM
status AS a
LEFT JOIN user u ON a.user_id = u.id
LEFT JOIN category c ON a.category_id = c.category_id
LEFT JOIN project p ON a.project_id = p.project_id
LEFT JOIN domain d ON a.domain_id = d.domain_id
LEFT JOIN status_tag st ON (a.id = st.status_id)
LEFT JOIN state s ON a.state_id = s.state_id
LEFT JOIN `chronology` chr ON (a.id = chr.status_id)
RIGHT JOIN tag t ON (t.tag_id = st.tag_id)
LEFT OUTER JOIN(
SELECT
topic_id,MAX(modified) AS modified, COUNT(topic_id) AS `relationentrynum`
FROM
res
GROUP BY topic_id
) AS r ON a.id = r.topic_id
LEFT JOIN(
SELECT
a.category_id, a.category, a.parent_id,
CASE WHEN a.parent_id = 0
then a.fonticon
else b.fonticon
end AS fonticon,
CASE WHEN a.parent_id = 0
then a.color
else b.color
end AS color,
CASE WHEN a.parent_id = 0
then a.category
else b.category
end AS parent_category,
CASE WHEN a.parent_id = 0
then a.category_id
else a.parent_id
end AS parent_id2
FROM
category a
LEFT JOIN
category b on a.parent_id = b.category_id
) AS z ON a.category_id = z.category_id
LEFT JOIN(
SELECT
a.project_id, a.project, a.parent_id,
CASE WHEN a.parent_id = 0
then a.fonticon
else b.fonticon
end AS fonticon,
CASE WHEN a.parent_id = 0
then a.color
else b.color
end AS color,
CASE WHEN a.parent_id = 0
then a.project
else b.project
end AS parent_project,
CASE WHEN a.parent_id = 0
then a.project_id
else a.parent_id
end AS parent_id2
FROM
project a
LEFT JOIN
project b on a.parent_id = b.project_id
) AS x ON a.project_id = x.project_id
LEFT JOIN(
SELECT
a.domain_id, a.domain, a.parent_id,
CASE WHEN a.parent_id = 0
then a.fonticon
else b.fonticon
end AS fonticon,
CASE WHEN a.parent_id = 0
then a.color
else b.color
end AS color,
CASE WHEN a.parent_id = 0
then a.domain
else b.domain
end AS parent_domain,
CASE WHEN a.parent_id = 0
then a.domain_id
else a.parent_id
end AS parent_id2
FROM
domain a
LEFT JOIN
domain b on a.parent_id = b.domain_id
) AS y ON a.domain_id = y.domain_id
WHERE a.public = 1
GROUP BY a.id
ORDER BY GREATEST(a.`modified`,IFNULL(`rmodified`, a.`modified`))DESC, a.`created_at` DESC
";
return $this->fetchAll($sql);
}
修正対応
SQLを一意に特定できるよう、GroupBy句に取得するカラムを指定
GROUP BY に chr.modified を追加
GROUP BY a.id,chr.modified
public function fetchStatusRelationLastResEntryAll()//レスがない場合、最新一覧日は空欄(RIGHTで逆)
{
// SELECT DISTINCT et.* FROM
// エントリーテーブル et
// LEFT OUTER JOIN エントリー所属カテゴリーテーブル ec
// ON (et.エントリーID = ec.エントリーID)
// WHERE ec.カテゴリーID = 1
$sql = "
SELECT
a.id AS id,
a.category_id AS category_id,
a.project_id AS project_id,
a.domain_id AS domain_id,
a.state_id AS state_id,
a.official_url AS official_url,
a.body AS body,
a.counter AS counter,
a.created_at AS created_at,
a.modified AS modified,
a.topic_name,
z.*,
s.situation,
s.color AS statecolor,
r.modified AS rmodified,
u.display_name,
u.site_id,
c.category,
p.project,
d.domain,
`chr`.`modified` AS chrmodified,
relationentrynum,
GROUP_CONCAT(t.tag) AS tag,
GROUP_CONCAT(t.color) AS tag_color,
GROUP_CONCAT(st.tag_id) AS tag_id,
c.color AS category_color,
p.color AS project_color,
d.color AS domain_color
FROM
status AS a
LEFT JOIN user u ON a.user_id = u.id
LEFT JOIN category c ON a.category_id = c.category_id
LEFT JOIN project p ON a.project_id = p.project_id
LEFT JOIN domain d ON a.domain_id = d.domain_id
LEFT JOIN status_tag st ON (a.id = st.status_id)
LEFT JOIN state s ON a.state_id = s.state_id
LEFT JOIN `chronology` chr ON (a.id = chr.status_id)
RIGHT JOIN tag t ON (t.tag_id = st.tag_id)
LEFT OUTER JOIN(
SELECT
topic_id,MAX(modified) AS modified, COUNT(topic_id) AS `relationentrynum`
FROM
res
GROUP BY topic_id
) AS r ON a.id = r.topic_id
LEFT JOIN(
SELECT
a.category_id, a.category, a.parent_id,
CASE WHEN a.parent_id = 0
then a.fonticon
else b.fonticon
end AS fonticon,
CASE WHEN a.parent_id = 0
then a.color
else b.color
end AS color,
CASE WHEN a.parent_id = 0
then a.category
else b.category
end AS parent_category,
CASE WHEN a.parent_id = 0
then a.category_id
else a.parent_id
end AS parent_id2
FROM
category a
LEFT JOIN
category b on a.parent_id = b.category_id
) AS z ON a.category_id = z.category_id
LEFT JOIN(
SELECT
a.project_id, a.project, a.parent_id,
CASE WHEN a.parent_id = 0
then a.fonticon
else b.fonticon
end AS fonticon,
CASE WHEN a.parent_id = 0
then a.color
else b.color
end AS color,
CASE WHEN a.parent_id = 0
then a.project
else b.project
end AS parent_project,
CASE WHEN a.parent_id = 0
then a.project_id
else a.parent_id
end AS parent_id2
FROM
project a
LEFT JOIN
project b on a.parent_id = b.project_id
) AS x ON a.project_id = x.project_id
LEFT JOIN(
SELECT
a.domain_id, a.domain, a.parent_id,
CASE WHEN a.parent_id = 0
then a.fonticon
else b.fonticon
end AS fonticon,
CASE WHEN a.parent_id = 0
then a.color
else b.color
end AS color,
CASE WHEN a.parent_id = 0
then a.domain
else b.domain
end AS parent_domain,
CASE WHEN a.parent_id = 0
then a.domain_id
else a.parent_id
end AS parent_id2
FROM
domain a
LEFT JOIN
domain b on a.parent_id = b.domain_id
) AS y ON a.domain_id = y.domain_id
WHERE a.public = 1
GROUP BY a.id,chr.modified
ORDER BY GREATEST(a.`modified`,IFNULL(`rmodified`, a.`modified`))DESC, a.`created_at` DESC
";
return $this->fetchAll($sql);
}
→ MySQLでSELECT文を作成するための基本的な考え方。どの構文を採用するか、までの思考履歴