নির্বাচনী তালিকাটি গ্রুপের অধীনে গ্রোপে নেই এবং এতে অ-গ্রেগ্রেটেড কলাম রয়েছে ... এসকিউএল_মোড = কেবল_ সম্পূর্ণ_গ্রুপ_বিহীন সাথে বেমানান


134

আমি ডাব্লুএএমএপি সার্ভারের সাথে আমার উইন্ডোজ পিসিতে মাইএসকিউএল 5.7.13 ব্যবহার করছি

এখানে আমার সমস্যাটি এই কোয়েরিটি সম্পাদন করার সময়

SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
      `status` = 'Active'
GROUP BY `proof_type`

আমি সর্বদা এর মতো ত্রুটি পাচ্ছি

নির্বাচন তালিকার # 1 এক্সপ্রেশনটি গ্রুপের মাধ্যমে গ্রুপে নেই এবং এতে গ্রাগ বিপি ক্লজের কার্যকরীভাবে নির্ভর করে না এমন 'কমান্ডার' returntr_prod.tbl_customer_pod_uploads.id 'রয়েছে; এটি স্কয়ার_মোড = কেবল_ সম্পূর্ণ_গ্রুপ_বিয়ের সাথে বেমানান

আপনি কি আমাকে সবচেয়ে ভাল সমাধান বলতে পারেন ...

আমার মতো রেজাল্ট দরকার

+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| id | user_id | load_id | bill_id | latitude | langitude | proof_type | document_type | file_name    | is_private | status | createdon           | updatedon           |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
|  1 |       1 | 78      | 1       | 21.1212  | 21.5454   |          1 |             1 | id_Card.docx |          0 | Active | 2017-01-27 11:30:11 | 2017-01-27 11:30:14 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+

12
ব্যবহার করবেন না SELECT *
shmosel


এই নির্বাচন আইডি থেকে tbl_customer_pod_uploadsযেখানে বলা হচ্ছে সেখান থেকে load_id='৮ '' এবং status= 'অ্যাক্টিভ' গ্রুপের মাধ্যমেproof_type
ধনু কে

4
আপনি যদি পুরানো প্রশ্নের জন্য সামঞ্জস্য চান তবে আপনি only_full_group_byএসকিউএল মোডটি বন্ধ করতে পারেন ।
বার্মার

4
ANY_VALUE (proof_type) ব্যবহার করার চেষ্টা করুন: dev.mysql.com/doc/refman/5.7/en/group-by-handling.html নির্বাচন *, ANY_VALUE (proof_type) থেকে tbl_customer_pod_uploadsকোথায় load_id= '78' এবং status= 'সক্রিয়' গ্রুপproof_type
AlexGach

উত্তর:


258

এই

নির্বাচন তালিকার # 1 এক্সপ্রেশনটি গ্রুপের মাধ্যমে গ্রুপে নেই এবং এতে গ্রাগ বিপি ক্লজের কার্যকরীভাবে নির্ভর করে না এমন 'কমান্ডার' returntr_prod.tbl_customer_pod_uploads.id 'রয়েছে; এটি স্কয়ার_মোড = কেবল_ সম্পূর্ণ_গ্রুপ_বিয়ের সাথে বেমানান

এই কমান্ডটি দ্বারা মাইএসকিউএল-তে এসকিএল মোড পরিবর্তন করেই সমাধান করা হবে,

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

এটি আমার জন্যও কাজ করে .. আমি এটি ব্যবহার করেছি, কারণ আমার প্রকল্পে এই জাতীয় অনেক প্রশ্ন রয়েছে তাই আমি এই স্কেল মোডটি কেবলমাত্র_ফুল_গোষ্ঠী_এতে পরিবর্তন করেছি

ধন্যবাদ... :-)


14
এটা আমার জন্য কাজ করে!. তুমি আমার দিন বাঁচাও
MYSQL সার্ভিসটি

4
আমি যদি কোডিগিটার ব্যবহার করছি এবং আমি মডেলটিতে চালনা করতে চাই, তবে আমি কীভাবে এটি ব্যবহার করব? আমাকে সাহায্য করতে পারেন ? @ মার্কোড_ইলি
ধাওয়ালঠাকোর

@ ধাওয়ালঠাকোর, আপনি একবার আপনার সার্ভারে এই ক্যোয়ারী চালালে আপনার বারবার চালানোর দরকার নেই। সুতরাং আপনার এটি আপনার মডেলটিতে রাখার দরকার নেই
ধনু কে

4
মাইএসকিউএল 5.7.29, পরিষেবাটি আরম্ভ করার দরকার পড়েনি
তাবি

আমি সার্ভার সংস্করণটি ব্যবহার করছি: 5.7.31-0ubuntu0.16.04.1 - (উবুন্টু), এবং যখনই আমি আমার মেশিনটি শুরু করি, আমি প্রতিবারই এটি সেট করি, এর কোনও স্থায়ী সমাধান আছে কি?
অর্পিতা হুঙ্কা

80

যখন মাইএসকিউএল এর only_full_group_byমোড চালু থাকে, এর অর্থ হ'ল ব্যবহারের সময় কঠোর এএনএসআই এসকিউএল বিধি প্রযোজ্য হবে GROUP BY। আপনার প্রশ্নের বিষয়ে, এর মানে যদি আপনি যে GROUP BYএর proof_typeকলাম, তারপর আপনি শুধুমাত্র দুটি জিনিস বেছে নিতে পারেন:

  • proof_typeকলাম, বা
  • অন্য যে কোনও কলামের সমষ্টি


অন্যান্য কলাম "দলা" দ্বারা, আমি যেমন একটি সমষ্টিগত ফাংশন ব্যবহার করে মানে MIN(), MAX()অথবা AVG()অন্য কলাম সহ। সুতরাং আপনার ক্ষেত্রে নিম্নলিখিত কোয়েরিটি বৈধ হবে:

SELECT proof_type,
       MAX(id) AS max_id,
       MAX(some_col),
       MIN(some_other_col)
FROM tbl_customer_pod_uploads
WHERE load_id = '78' AND
      status = 'Active'
GROUP BY proof_type

মাইএসকিউএল GROUP BYপ্রশ্নগুলির বৃহত সংখ্যা যা আমি এসও তে দেখি সেগুলির কঠোর মোড বন্ধ হয়ে গেছে, সুতরাং কোয়েরিটি চলছে, তবে ভুল ফলাফল সহ। আপনার ক্ষেত্রে, কোয়েরিটি মোটেও চলবে না, আপনাকে কী করতে চান তা ভাবতে বাধ্য করে।

দ্রষ্টব্য: এএনএসআই এসকিউএল GROUP BYকলামগুলি নির্বাচন করে যা কলাম (গুলি) নির্বাচিত হচ্ছে তার উপর কার্যকরীভাবে নির্ভর করে যা নির্বাচনের জন্য অনুমোদিত তা প্রসারিত করে । ক্রিয়ামূলক নির্ভরতার একটি উদাহরণ কোনও সারণীতে একটি প্রাথমিক কী কলাম দ্বারা গোষ্ঠীকরণ করা হবে। যেহেতু প্রাথমিক কীটি প্রতিটি রেকর্ডের জন্য অনন্য হওয়ার গ্যারান্টিযুক্ত, সুতরাং অন্য যে কোনও কলামের মানও নির্ধারিত হবে। মাইএসকিউএল একটি ডাটাবেস যা এটির জন্য অনুমতি দেয় (এসকিউএল সার্ভার এবং ওরাকল আফিক নয়) AF


4
কেবল একটি নোট: ফলাফলটি ভুল নয় (এটি মাইএসকিউএল নিয়ম অনুসরণ করে), তবে এটি অনুমানযোগ্য, অর্থাত্ কলামগুলি গোষ্ঠীর অংশ নয় এবং সমষ্টিগত নয় (এবং কার্যকরীভাবে নির্ভরশীল নয়) সংশ্লিষ্ট গ্রুপ থেকে একটি 'এলোমেলো' মান প্রদান করবে। ম্যানুয়াল যুক্তরাষ্ট্রের মতো: "সার্ভার প্রতিটি গ্রুপ থেকে কোন মান চয়ন করতে মুক্ত"
মাস

কঠোর গোষ্ঠীভঙ্গ করা লঙ্ঘন করা অবশ্যই অগত্যা ভুল ফলাফল দেয় না । ক্ষেত্রগুলি অভিন্ন হওয়ার গ্যারান্টিযুক্ত হলে আমি সাধারণত এটি করি (উদাহরণস্বরূপ এক থেকে বহু লোকের যোগদান)। এমনকি এটির গ্যারান্টিযুক্ত না হলেও, একটি স্বেচ্ছাসেবী সারি নির্বাচন করা প্রায়শই আর একটি ভুল ফাংশন ব্যবহার না করে একটি সামগ্রিক ফাংশন ব্যবহার করে বা গোষ্ঠীকরণের স্তর যুক্ত করা হবে be
shmosel

4
আমার জন্য +1 উপরের "গৃহীত" উত্তরটি কেন গৃহীত হয়েছে তা আমার কোনও ধারণা নেই। আপনার উপায় সঠিক উপায় এবং স্বীকৃত উত্তর হ'ল স্বাভাবিক হ্যাকি ফিক্স যা ভবিষ্যতে আরও সমস্যার দিকে পরিচালিত করবে।
Jcov

4
@ জ্যাকভ ... এবং আমি আপনার মন্তব্যে আরও +1 সহ একমত হতে পারি না। এএনএসআই নিষেধাজ্ঞাকে বন্ধ GROUP BYকরা প্রায় সবসময়ই একটি খারাপ ধারণা। এটি আমাকে ভীতি প্রদর্শন করে যে এতগুলি ব্যবহারকারী ভুল পরামর্শ নিচ্ছেন এবং এটি ব্যবহার করছেন।
টিম বিগলেইসেন

4
@ টিমবিজেলিসেন আধুনিক অনুলিপি + পেস্ট বিকাশে আপনাকে স্বাগতম। "আমার ভাবার দরকার নেই, যে কেউ অবিশ্বাস্য উত্স থেকে কোথাও এলোমেলো জিনিস পড়েছেন সে ইতিমধ্যে আমার জন্য চিন্তাভাবনা করে ফেলেছে"।
জেসিভ

48

যে কোনও একটি সমাধান ব্যবহার করুন

(1) পিএইচপিএমআইএডমিন

আপনি যদি phpMyAdmin ব্যবহার করছেন তবে নীচের স্ক্রিনশটে উল্লিখিত " sql_mode " সেটিংস পরিবর্তন করুন । এখানে চিত্র বর্ণনা লিখুন

"স্কয়ার মোড" ভেরিয়েবল সম্পাদনা করুন এবং মান থেকে "কেবলমাত্র" কেবলমাত্র পাঠ্য "মুছে ফেলুন"

(২) এসকিউএল / কমান্ড প্রম্পট নীচের কমান্ডটি চালান।

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

(3) নির্বাচন করুন * ব্যবহার করবেন না

নির্বাচন কেরিতে প্রাসঙ্গিক কলামটি ব্যবহার করুন। প্রাসঙ্গিক অর্থ কলামগুলি, যা হয় হয় "গোষ্ঠী দ্বারা" ধারা বা সমষ্টিগত ফাংশন (MAX, MIN, SUM, COUNT ইত্যাদি) সহ কলামে are


গুরুত্বপূর্ণ তথ্য

(1) বা পয়েন্ট (2) পয়েন্ট ব্যবহার করে করা পরিবর্তনগুলি এটিকে স্থায়ীভাবে সেট করবে না এবং প্রতিটি পুনঃসূচনা করার পরে এটি আবার ফিরে আসবে।

সুতরাং আপনার এটি আপনার কনফিগার ফাইলে সেট করা উচিত (উদাঃ /etc/mysql/my.cnf [[mysqld] বিভাগে)), যাতে পরিবর্তনগুলি মাইএসকিউএল পুনরায় চালু হওয়ার পরে কার্যকর হয়:

ফাইল কনফিগার করুনকনফিগার : /etc/mysql/my.cnf

পরিবর্তনশীল নাম : sql_mode বা স্কেল -মোড


উপরের উত্তরের জন্য আপনাকে অনেক ধন্যবাদ। আপনি আমার মাই সিএনএফ-তে যেমন বলেছেন তেমন আমি এটি পরিবর্তন করতে চাই। তবে আমি যখন এই ফাইলটি খুলি, এটি কেবল পঠনযোগ্য মোডে খোলে। কোন সহায়তা বা রেফারেন্স লিঙ্ক ???? আমি উবুন্টু 16.04 ব্যবহার করি
সনমিতা সাধিশকুমার

4
(1) "chmod" কমান্ডটি ব্যবহার করে my.cnf ফাইলের ফাইলের অনুমতি পরিবর্তন করুন। (২) মাই সিএনএফ-এ পরিবর্তনগুলি সম্পাদন করুন (৩) এটি পুনরায় কেবল পঠনযোগ্য সেট করে ("chmod" ব্যবহার করে আবার ফাইলের অনুমতি পরিবর্তন করুন) (4) মাইএসকিএল পুনরায় চালু করুন
রাকেশ সোনি

21

নীচে পদ্ধতিতে আমার সমস্যার সমাধান হয়েছে:

উবুন্টুতে

প্রকার: sudo vi /etc/mysql/my.cnf

সন্নিবেশ মোডে প্রবেশ করতে A টাইপ করুন

দুটি লাইনের কোডের নীচে শেষ লাইনে পেস্ট করুন:

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

ইনপুট মোড থেকে প্রস্থান করতে এসকে টাইপ করুন

Type :wq to save and close vim.

sudo service mysql restartমাইএসকিউএল পুনরায় চালু করতে টাইপ করুন ।


4
ধন্যবাদ, এটা কাজ! সেন্ট ওসে, হুম, my.cnf sudo vi /etc/my.cnf- এ অবস্থিত ছিল
রিজেশ পিকে

19

আপনি কিছু কমান্ড দ্বারা sql_mode = only_ful_group_by অক্ষম করতে পারেন আপনি এটি টার্মিনাল বা মাই এসকিএল আইডিই দ্বারা চেষ্টা করতে পারেন

mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

11

উবুন্টুতে

ধাপ 1:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

পদক্ষেপ 2: শেষ লাইনে যান এবং নিম্নলিখিতটি যুক্ত করুন

sql_mode = ""

পদক্ষেপ 3: সংরক্ষণ করুন

পদক্ষেপ 4: মাইএসকিএল সার্ভার পুনরায় চালু করুন।


9

এসকিউএল 92-এ ক্যোয়ারীটি আইনী হওয়ার জন্য, নাম কলামটি অবশ্যই তালিকা থেকে বাদ দিতে হবে বা গ্রুপের দ্বারা গ্রুপে নাম লিখতে হবে।

এসকিউএল৯৯ এবং পরবর্তীকালে এই জাতীয় নন-গ্রেগ্রেটগুলি প্রতি alচ্ছিক বৈশিষ্ট্য T301 এর জন্য অনুমতি দেয় যদি তারা কার্যক্রমে গ্রুপ বা কলামের উপর নির্ভর করে: যদি এইরকম সম্পর্ক নাম এবং কাস্টিডের মধ্যে বিদ্যমান থাকে, তবে ক্যোয়ারীটি বৈধ। উদাহরণস্বরূপ, এটি ক্ষেত্রে গ্রাহকদের একটি প্রাথমিক কী জোর দেওয়া হয়েছিল।

মাইএসকিউএল 5.7.5 এবং আপ কার্যকরভাবে নির্ভরতা সনাক্তকরণ প্রয়োগ করে। যদি কেবলমাত্র_ফুলল_গ্রোপ_বিওয়াই এসকিউএল মোড সক্ষম করা থাকে (এটি এটি ডিফল্টরূপে) তবে মাইএসকিউএল অনুসন্ধানগুলি প্রত্যাখ্যান করে যার জন্য নির্বাচিত তালিকা, HAVING শর্ত, বা অর্ডার বাই তালিকা তালিকাসমূহের ভিত্তিতে নাম না থাকা গ্রাহকতার দ্বারা অনুমোদিত নয় এমন কলামগুলিকে উল্লেখ করে বা তাদের উপর কার্যকরীভাবে নির্ভর করে না ।

মাধ্যমে মাইএসকিউএল :: মাইএসকিউএল 5.7 রেফারেন্স ম্যানুয়াল :: 12.19.3 মাইএসকিউএল গ্রুপ সামলাচ্ছে

আপনি এই কমান্ডটি দিয়ে স্ক্যালি মোড পরিবর্তন করে এটি সমাধান করতে পারেন:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

এবং ... ডাটাবেস পুনরায় সংযোগ করতে ভুলবেন না !!!


5

phpmyadmin এ যান এবং কনসোলটি খুলুন এবং এই অনুরোধটি কার্যকর করুন

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

4

সমস্ত কলাম গ্রহণের পরিবর্তে হাই, কেবল আপনার প্রয়োজনীয় জিনিসগুলি ব্যবহার করে নিন ANY_VALUE(column_name) । এটি নিখুঁতভাবে কাজ করছে। শুধু পরীক্ষা.

যেমন:

SELECT proof_type,any_value("customer_name") as customer_name
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND `status` = 'Active' GROUP BY `proof_type`

3

আপনি পিএইচপিএমওয়াই অ্যাডমিন ব্যবহার করছেন এবং মানটি সরিয়ে ফেললে "এসকিউএল মোড" অনুসন্ধান করুন ONLY_FULL_GROUP_BY, ঠিক করেছেন এবং ঠিক আছে।


3
> sudo nano /etc/mysql/my.cnf

নীচে প্রবেশ করুন

[mysqld]
sql_mode = ""

Ctrl + O => Y = Ctrl + X

> sudo service mysql restart

2

এটি দেখতে কেমন তা থেকে, আমি মনে করি একাধিক কলাম / ক্ষেত্র দ্বারা গ্রুপিং করা আপনার ফলাফলকে আঘাত করবে না। আপনি কেন এইভাবে দলে যোগ করার চেষ্টা করবেন না:

GROUP BY `proof_type`, `id`

এটি proof_typeপ্রথমে গ্রুপ হবে id। আমি আশা করি এটি ফলাফলগুলি পরিবর্তন করবে না। কয়েকটি / বেশিরভাগ ক্ষেত্রে একাধিক কলাম দ্বারা গোষ্ঠী ভুল ফলাফল দেয়।


1
  1. পিএইচপিএমআইএডমিনে লগইন করুন
  2. নেভিগেট করুন: সার্ভার: লোকালহোস্ট: 3306 এবং কোনও ডাটাবেস নির্বাচন করবেন না
  3. উপরের মেনু থেকে পরিবর্তনশীল ক্লিক করুন
  4. "স্কয়ার মোড" অনুসন্ধান করুন এবং এর সাথে সম্পর্কিত মানটি সম্পাদনা করুন: NO_ENGINE_SUBSTITUTION

এখানেই শেষ.

আমি এটি আমার E2 এ করেছি এবং এটি কবজির মতো কাজ করেছে।


1

স্থায়ীভাবে সেট করার এটি এখানে একটি দ্রুত এবং সহজ উপায়

নোট: চলমান SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); অস্থায়ী এবং সার্ভার পুনরায় চালু করার সময় আপনি ত্রুটিটি শেষ করবেন। এটি স্থায়ীভাবে স্থির করতে নীচে করুন

  1. রুট হিসাবে আপনার সার্ভারে লগইন করুন
  2. আপনার টার্মিনাল রান wget https://gist.githubusercontent.com/nfourtythree/90fb8ef5eeafdf478f522720314c60bd/raw/disable-strict-mode.sh
  3. চালিয়ে স্ক্রিপ্টটি কার্যকর করা যায় Make chmod +x disable-strict-mode.sh
  4. চালিয়ে স্ক্রিপ্টটি চালান ./disable-strict-mode.sh

এবং আপনার হয়ে গেছে, পরিবর্তনগুলি mysql এ করা হবে এবং এটি পুনরায় চালু হবে


0

মাইএসকিউএল 8.0 এর জন্য আপডেট

তোমার sql-modeথাকবে না NO_AUTO_CREATE_USERযেমন তা এখানে উল্লেখ কারণে সরানো হয়েছে - কিভাবে-থেকে-সেট SQL-মোড-ইন-আমার-CNF-ইন-MySQL -8

[mysqld]
sql-mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

এছাড়াও কারও কাছে my.cnfফাইল না থাকলে তারা একটি নতুন ফাইল তৈরি করে /etc/my.cnfএবং তারপরে উপরের লাইনগুলি যুক্ত করে।


0

আমার ডাটাবেস ক্রাশের অংশে আমার একই সমস্যা ছিল। আমি যা করেছি তা হ'ল আমি পিপিপিএসটর্ম ডাটাবেস কনসোলের মাধ্যমে ডিবিতে প্যারামিটারটি পরিবর্তন করেছি:

   SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

মোহন মত কাজ করে এখন



-2

আপনাকে ডাব্লুএএমপি প্যানেলটি খুলুন এবং মাইএসকিউএল কনফিগারেশন ফাইলটি খুলুন। এটিতে "sql_mode" অনুসন্ধান করুন যদি আপনি এটি "" এ সেট করে দেখেন তবে অন্যথায় যদি এটি খুঁজে না পান তবে ফাইলটিতে sql_mode = "" যুক্ত করুন add

মাইএসকিউএল সার্ভারটি পুনরায় চালু করুন এবং আপনি যেতে ভাল ...

শুভ কোডিং

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.