মাইএসকিউএলে কোয়েরি চালানোর সময় কেবল_ফুল_গ্রুপ_বিযুক্ত ত্রুটি


442

আমি আমার সিস্টেমটি আপগ্রেড করেছি এবং আমি যে ওয়েব অ্যাপ্লিকেশনটিতে কাজ করছি তার জন্য পিএইচপি সহ মাইএসকিএল 5.7.9 ইনস্টল করেছি। আমার একটি ক্যোয়ারী রয়েছে যা গতিশীলভাবে তৈরি হয়েছিল এবং মাইএসকিএল-র পুরানো সংস্করণে চালিত হওয়ার পরে এটি দুর্দান্ত কাজ করে। 5.7 এ আপগ্রেড করার পরে আমি এই ত্রুটিটি পেয়েছি:

নির্বাচন তালিকার # 1 এক্সপ্রেশন গ্রোপ বাই ক্লজটিতে নেই এবং এতে অবৈধ কলাম 'সমর্থন_desk.mod_users_groups.group_id' রয়েছে যা GROUP BY দন্ডের কলামগুলির সাথে কার্যকরীভাবে নির্ভর করে না; এটি স্কয়ার_মোড = কেবল_ সম্পূর্ণ_গ্রুপ_বিয়ের সাথে বেমানান

সার্ভার এসকিউএল মোডের বিষয়টিতে মাইএসকিএল 5.7 এর জন্য ম্যানুয়াল পৃষ্ঠাটি নোট করুন ।

এটি আমার কাছে যে প্রশ্নটি দিচ্ছে তা:

SELECT mod_users_groups.group_id AS 'value', 
       group_name AS 'text' 
FROM mod_users_groups
LEFT JOIN mod_users_data ON mod_users_groups.group_id = mod_users_data.group_id 
WHERE  mod_users_groups.active = 1 
  AND mod_users_groups.department_id = 1 
  AND mod_users_groups.manage_work_orders = 1 
  AND group_name != 'root' 
  AND group_name != 'superuser' 
GROUP BY group_name 
HAVING COUNT(`user_id`) > 0 
ORDER BY group_name

আমি ইস্যুতে কিছু গুগলিং করেছি, তবে only_full_group_byকোয়েরিটি ঠিক করার জন্য আমার কী করা দরকার তা নির্ধারণ করার জন্য আমি যথেষ্ট বুঝতে পারি না । আমি কি কেবলমাত্র only_full_group_byবিকল্পটি বন্ধ করতে পারি , বা আমার আরও কিছু করার দরকার আছে?

আপনার যদি আরো তথ্য লাগে তবে আমাকে জানাবেন।


এখানে আমি সমাধান সন্ধান করেছি স্ট্যাকওভারফ্লো.com
ওয়াসিম এ।

21
এটি আমার মধ্যে সবচেয়ে বেশি সংঘবদ্ধ ত্রুটি বার্তা হতে হয়েছিল।
রলফ

2
@ রল্ফ আপনি কি ওরাকলে একই ধরণের সমস্যার জন্য ত্রুটিটি দেখেছেন? " not a GROUP BY expression" এটা। তাদের পাশাপাশি কেবল একটি সংখ্যাগত ত্রুটি কোড থাকতে পারে এবং কোনও বার্তা নেই।
বিল কারউইন

উত্তর:


359

আমি শুধু যোগ group_idকরতে হবে GROUP BY

এর SELECTঅংশ নয় এমন একটি কলাম যুক্ত GROUP BYকরার সময় গ্রুপগুলির মধ্যে সেই কলামটির জন্য একাধিক মান থাকতে পারে, তবে ফলাফলগুলিতে কেবলমাত্র একটি একক মানের জন্য স্থান থাকবে। সুতরাং, ডাটাবেসগুলিকে সাধারণত কীভাবে সেই একাধিক মানকে একটি মান হিসাবে তৈরি করা যায় তা বলা দরকার to সাধারণভাবে, ভালো একটি সমষ্টিগত ফাংশন সম্পন্ন করা হয় COUNT(), SUM(), MAX()ইত্যাদি ... আমি বলতে সাধারণত কারণ অধিকাংশ অন্যান্য জনপ্রিয় ডাটাবেস সিস্টেম এই জিদ। যাইহোক, মাইএসকিউএল ৫.7 সংস্করণের পূর্বে ডিফল্ট আচরণটি আরও ক্ষমাযোগ্য কারণ এটি অভিযোগ করবে না এবং তারপরে নির্বিচারে কোনও মান চয়ন করবে ! এটিতেও একটি রয়েছেANY_VALUE()যদি আপনার আগের মতো একই আচরণের প্রয়োজন হয় তবে এই প্রশ্নের অন্য সমাধান হিসাবে ব্যবহৃত হতে পারে এমন ফাংশন। এই নমনীয়তাটি ব্যয়বহুলভাবে আসে কারণ এটি অ-নিরঙ্কুশাত্মক, তাই আপনার এটির প্রয়োজনের খুব ভাল কারণ না থাকলে আমি এটিকে সুপারিশ করব না। মাইএসকিউএল এখন only_full_group_byভাল কারণে ডিফল্টরূপে সেটিংসটি চালু করছে , সুতরাং এটির অভ্যাস করা এবং আপনার প্রশ্নগুলি এটি মেনে চলাই ভাল।

তাহলে কেন আমার উপরে সহজ উত্তর? আমি কয়েকটি অনুমান করেছি:

1) group_idঅনন্য। যুক্তিসঙ্গত বলে মনে হচ্ছে, এটি সর্বোপরি একটি 'আইডি'।

2) group_nameএছাড়াও অনন্য। এটি এই জাতীয় যুক্তিসঙ্গত ধারণা নাও হতে পারে। যদি এটি না হয় এবং আপনার কিছু অনুলিপি থাকে group_namesএবং তারপরে যোগ group_idকরার জন্য আমার পরামর্শ অনুসরণ করেন তবে GROUP BYআপনি দেখতে পাচ্ছেন যে আপনি এখন আগের চেয়ে বেশি ফলাফল পেয়েছেন কারণ একই নামের গোষ্ঠীগুলির এখন ফলাফলগুলিতে পৃথক সারি থাকবে। আমার কাছে, এই সদৃশ গোষ্ঠীগুলি গোপন করার চেয়ে এটি আরও ভাল হবে কারণ ডাটাবেসটি নির্বিচারে নির্বিচারে একটি মান নির্বাচন করেছে!

যখন একাধিক টেবিল জড়িত থাকে তখন তাদের টেবিলের নাম বা উপন্যাস সহ সমস্ত কলামগুলি যোগ্য করে তোলাও ভাল অনুশীলন ...

SELECT 
  g.group_id AS 'value', 
  g.group_name AS 'text' 
FROM mod_users_groups g
LEFT JOIN mod_users_data d ON g.group_id = d.group_id 
WHERE g.active = 1 
  AND g.department_id = 1 
  AND g.manage_work_orders = 1 
  AND g.group_name != 'root' 
  AND g.group_name != 'superuser' 
GROUP BY 
  g.group_name, 
  g.group_id 
HAVING COUNT(d.user_id) > 0 
ORDER BY g.group_name

আপনাকে ধন্যবাদ, এটি নিখুঁত কাজ করে। আমিও সম্মত হই যে কলামগুলি যোগ্য করে তোলা দরকার। এটি অস্পষ্টতার যে কোনও সম্ভাবনা দূর করে। আমি এখন কোডটি মেরামত করতে চলেছি। সহায়তার জন্য এক মিলিয়ন ধন্যবাদ
ড্যান বেমোস্কি

GROUP BYআমার ক্যোয়ারীতে এমনকি আমার কাছে একটি ধারাও নেই, তবুও আমি এই ত্রুটিটি পাচ্ছি।
আইচখান

@ হারুন খান, এটি একটি নতুন প্রশ্নের মতো মনে হচ্ছে। আপনি যদি এটি জিজ্ঞাসা করেন তবে আমাকে জানান এবং আমি একবার দেখে নিই।
davmos

2
মাইএসকিউএল ৫.7 এ তারা এমন একটি সম্পত্তি সেট করেছেন যা একটি ক্যোয়ারির সমস্ত অ-সমষ্টি ক্ষেত্রের একটি গ্রুপ বাই হতে হবে। সুতরাং যেমন একটি নির্বাচন যেমন নির্বাচন করুন, সুম (খ) থেকে সারণী; তার অর্থ ক্ষেত্র "এ" অবশ্যই গ্রুপের মধ্যে থাকতে হবে। সুতরাং আপনার যদি কোনও গ্রুপ না থাকে তবে আপনাকে অবশ্যই এটি ক্যোয়ারিতে যুক্ত করতে হবে। আপনার জিজ্ঞাসার SELECT অংশে আপনার কমপক্ষে একটি মোট ক্ষেত্র থাকলে তা সবই।
ব্যবহারকারী 1567291

এই উত্তরে প্রস্তাবিত ধারা অনুসারে আইটেমটি গ্রুপে যুক্ত করে আমাকে "সতর্কতা" ঠিক করতে হয়েছিল কারণ sql_mode সংশোধন করার প্রস্তাব দেওয়া কোনও উত্তরই কাজ করে না। (আমার মাইএসকিউএল একটি সঞ্চিত পদ্ধতিতে ছিল তবে তা প্রাসঙ্গিক কিনা তা জানেন না)
জাজাপার

355

আপনি only_full_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';

মাইএসকিউএল 8 গ্রহণ করে না NO_AUTO_CREATE_USERযাতে এটি সরানো দরকার।


85
এটি প্রায় কাজ, আপনি সতর্কতাটি স্থির করার চেয়ে আপনার ক্যোয়ারীটি আরও ভাল করে নিন
আজেফরাতি

1
/Etc/mysql/my.cnf আপডেট করা (নীচে দেখানো হয়েছে) একটি আরও টেকসই সমাধান কারণ ডিফল্ট সেটিংস পুনরায় আরম্ভের পরে ফিরে আসার ঝোঁক। এবং যারা আপনার বলছেন যে আপনার ক্যোয়ারীটি ঠিক করা উচিত, তখন এটি কখনও কখনও সহজ হয় না যখন আপনার দ্রুত ডিবাগিং কোয়েরির প্রয়োজন হয় SELECT COUNT(*), t.* FROM my_table t GROUP BY colএবং আপনি যেমন কাজ করেন এবং আপনার 20-50 কলাম রয়েছে, আপনি কি প্রতিটি কলামটি প্রতিটি কলাম যুক্ত করতে এতটা সময় ব্যয় করতে চান? দ্বারা গ্রুপ?
শাদোয়েব

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

1
আমি আমার বর্তমান এসকিউএল_মোডের মাধ্যমে সন্ধানের মাধ্যমে SELECT @@sql_mode;এবং তারপরে সেখান থেকে ফলাফলটি My.cnf- এ যুক্ত করে রিফ্রেশের মাধ্যমে এই অবিচল করেছিলাম :sql_mode=[list of modes from query, minus ONLY_FULL_GROUP_BY]
18:38

323

অন্যান্য উত্তরে বর্ণিত হিসাবে আপনি সতর্কতা বার্তাটি বন্ধ করতে পারেন বা কী ঘটছে তা বুঝতে এবং এটি ঠিক করতে পারেন।

মাইএসকিউএল ৫.7.৫ অনুসারে, ডিফল্ট এসকিউএল মোডে কেবলমাত্র_এফ.এল.এল.এল.এল.আল.আর.আর.আ.আর.আ.আ.আ.আ.আ.আ.উ...................... বা অন্তর্ভুক্ত থাকে যার অর্থ আপনি যখন সারিগুলি গোষ্ঠীভুক্ত করেন এবং তারপরে সেই গোষ্ঠীগুলির মধ্যে থেকে কোনও কিছু নির্বাচন করেন, তখন আপনাকে স্পষ্টভাবে বলতে হবে যে সেই নির্বাচনটি কোন সারি থেকে তৈরি করা উচিত। আপনি যে গোষ্ঠীতে সন্ধান করছেন তাতে কোন সারিটি মাইএসকিএলকে জানতে হবে যা আপনাকে দুটি বিকল্প দেয়

আপনি যে গোষ্ঠীতে সন্ধান করছেন তাতে কোন সারিটি মাইএসকিএলকে জানতে হবে যা আপনাকে দুটি বিকল্প দেয়

  • আপনি গ্রুপ স্টেটমেন্টে আপনার পছন্দসই কলামটি যুক্ত করতে পারেন group by rect.color, rect.valueযা কিছু ক্ষেত্রে আপনি যা চান তা হতে পারে অন্যথায় একই রঙের সাথে সদৃশ ফলাফল যা আপনি নাও চান তা ফেরত দিতে পারে
  • আপনি সম্পূর্ণ তালিকার মতো গ্রুপগুলির মধ্যে কোন সারিটি সন্ধান করছেন তা নির্দেশ করতে আপনি মাইএসকিএল এর সামগ্রিক ফাংশনও ব্যবহার করতে পারেনAVG() MIN() MAX()
  • এবং অবশেষে আপনি ব্যবহার করতে পারেন ANY_VALUE()যদি আপনি নিশ্চিত হন যে গ্রুপের সমস্ত ফলাফল একই the ডক

25
আমার মনে হয় না যে মাইএসকিউএল FIRST()পদ্ধতি / ফাংশন সমর্থন করে ?
বেন গিল্ড

3
আমি বিশ্বাস করি যে মাইএসকিউএল (কমপক্ষে 5.7 এর পূর্বে) একটি গ্রুপে এটির প্রথম মানটি নেওয়ার ক্ষেত্রে খেলাপি হয়। সুতরাং, FIRST () নেই কারণ এটি নিজে গ্রুপ বাই ফাংশনের সমার্থক হিসাবে ব্যবহৃত হত।
DrDamnit

2
@ ডিড্যামনিট, আমি বিশ্বাস করি এ জাতীয় ক্ষেত্রে এটি এলোমেলো নির্বাচনের মতো ছিল যা বিভ্রান্তির কারণ হয়ে ONLY_FULL_GROUP_BY
দাঁড়ায়

6
আমি উত্তরটি ইতিমধ্যে জানলাম, তবে রঙিন আয়তক্ষেত্রের উদাহরণটি বোঝা এত সহজ, আমি পরের বার যখন কেউ আমাকে সম্পর্কে এটি জিজ্ঞাসা করবে তখন আমি এটি পুনরায় ব্যবহার করব।
ব্যবহারকারী 327961

@ আরাফাতীতে FIRST () এর মতো কিছু রয়েছে বা এমন কিছু ক্যোয়ারী রয়েছে যা আমার ক্ষেত্রে যেমন প্রথম মান পেতে ব্যবহার করা যেতে পারে।
হারিস

169

আপনি যদি আপনার বর্তমান ক্যোয়ারিতে কোনও পরিবর্তন করতে না চান তবে নীচের পদক্ষেপগুলি অনুসরণ করুন -

  1. আপনার বাক্সে rant
  2. টাইপ করুন: sudo vim /etc/mysql/my.cnf
  3. ফাইলের নীচে স্ক্রোল করুন এবং Aসন্নিবেশ মোডে প্রবেশ করতে টাইপ করুন
  4. কপি এবং পেস্ট

    [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
  5. escইনপুট মোড থেকে প্রস্থান করতে টাইপ করুন

  6. :wqভিএম সংরক্ষণ এবং বন্ধ করতে টাইপ করুন ।
  7. sudo service mysql restartমাইএসকিউএল পুনরায় চালু করতে টাইপ করুন ।

অ্যাডোনিসজেএস-এর সাহায্যে এটি ব্যবহার করার চেষ্টা করে সমস্ত ভ্যাগ্র্যান্ট ব্যবহারকারীদের কেবল একটি শীর্ষস্থানীয় আপনার এই paginateক্রিয়াকলাপটি চালনার জন্য প্রয়োজন ।
মাইকেল জে। ক্যালকিনস 26'16

এটি স্পষ্টতই ভ্যাগ্র্যান্ট ব্যবহারকারীদের জন্য নয়, কোনও ইউনিক্স সিস্টেমের জন্য। নোট করুন যে আমার জন্য my.cnfফাইল অবস্থান ছিল /etc। আলস নতুন সিনট্যাক্সটি নোট করুনMySQL 5.7.8: sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
ভ্যালেন্টিন গ্রাগোয়ার

19.3 মিন্টে আমার জন্য কাজ করে (উবুন্টু 18.04) ধন্যবাদ
মার্কো

71

ANY_VALUE()অনাগ্রেগ্রেটেড কলামটি উল্লেখ করতে ব্যবহার করুন ।

SELECT name,           address , MAX(age) FROM t GROUP BY name; -- fails
SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name; -- works

থেকে মাইএসকিউএল 5.7 ডক্স :

অনাগ্রেগ্রেটেড কলামটি উল্লেখ ONLY_FULL_GROUP_BY করে ANY_VALUE()আপনি অক্ষম না করে একই প্রভাব অর্জন করতে পারেন ।

...

এই জিজ্ঞাসাটি ONLY_FULL_GROUP_BYসক্ষম থাকলে অবৈধ হতে পারে কারণ নির্বাচনের তালিকায় অ-অনুমোদিত ঠিকানা কলামটির নাম GROUP BYদফাটিতে নেই:

SELECT name, address, MAX(age) FROM t GROUP BY name;

...

যদি আপনি জানেন যে, প্রদত্ত ডেটা সেটের জন্য, প্রতিটি নামের মান বাস্তবে ঠিকানা মান নির্ধারণ করে, ঠিকানা কার্যকরভাবে নামের উপর নির্ভরশীল। মাইএসকিউএলকে কোয়েরিটি গ্রহণ করতে বলার জন্য, আপনি ANY_VALUE()ফাংশনটি ব্যবহার করতে পারেন :

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;

1
যেহেতু এই সমস্যার জন্য কিছুক্ষণ চলছিল - আমি বিশেষত এই সমাধানটি পছন্দ করি কারণ এটি আপনার মাইএসকিউএল সেটআপে কোনও ফাইল বা সেটিংস পরিবর্তন করার প্রয়োজন হয় না। আকর্ষণীয়ভাবে যথেষ্ট, আমি ANY_VALUE অন্য কোথাও অনুরূপ আলোচনায় উল্লিখিত দেখতে পাই না - আমার GROUP_BY contains nonaggregated columnত্রুটিটি নিয়ে আমার পক্ষে পুরোপুরি কাজ করে ।
adstwlearn

50

এই ত্রুটিটি কী সম্পর্কে আমি আপনাকে তা বোঝানোর চেষ্টা করব।
মাইএসকিউএল ৫.7.৫ থেকে শুরু ONLY_FULL_GROUP_BYকরে ডিফল্টরূপে বিকল্পটি সক্ষম করা হয়েছে।
সুতরাং, স্ট্যান্ডার্ড এসকিউএল 92 এবং তার আগের অনুসারে:

যে তালিকাগুলির জন্য নির্বাচিত তালিকা, HAVING শর্ত, বা অর্ডার বাই তালিকাটি অনুমোদিত নয় এমন কলামগুলিকে উল্লেখ করেছে যা গ্রুপ বাই দলে নাম নেই বা কার্যকরীভাবে নির্ভর করে (স্বতন্ত্র দ্বারা নির্ধারিত) GROUP BY কলামের উপর নির্ভর করে না

( ডক্সে আরও পড়ুন )

সুতরাং, উদাহরণস্বরূপ:

SELECT * FROM `users` GROUP BY `name`;

উপরের ক্যোয়ারি কার্যকর করার পরে আপনি ত্রুটি বার্তা পাবেন।

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

কেন?
যেহেতু মাইএসকিউএল সঠিকভাবে বুঝতে পারে না, গ্রুপভুক্ত রেকর্ডগুলি থেকে উদ্ধৃত করার জন্য নির্দিষ্ট মানগুলি কী এবং এটি মূল বিষয় the

IE বলতে দেয় যে আপনার usersটেবিলে এই রেকর্ড রয়েছে:
ইয়ো

এবং আপনি উপরে অবৈধ ক্যোয়ারী শোইন কার্যকর করবেন।
এবং আপনি উপরে প্রদর্শিত ত্রুটি পাবেন, কারণ, নামের সাথে 3 টি রেকর্ড রয়েছে John, এবং এটি দুর্দান্ত, তবে, তাদের সকলের emailক্ষেত্রে পৃথক ক্ষেত্রের মান রয়েছে।
সুতরাং, মাইএসকিউএল সহজেই বুঝতে পারছে না যে তাদের মধ্যে ভাগ্যবদ্ধ রেকর্ডে কোনটি ফিরে আসবে।

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

SELECT `name` FROM `users` GROUP BY `name`

এছাড়াও, আপনি নির্বাচন বিভাগে আরও ক্ষেত্র যুক্ত করতে চাইতে পারেন, তবে আপনি এটি করতে পারবেন না, যদি সেগুলি একত্রিত না করা হয় তবে সেখানে ক্র্যাচ রয়েছে যা আপনি ব্যবহার করতে পারেন (তবে অত্যন্ত পুনরুদ্ধারযোগ্য নয়):

SELECT ANY_VALUE(`id`), ANY_VALUE(`email`), `name` FROM `users` GROUP BY `name`

এখানে চিত্র বর্ণনা লিখুন

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

দয়া করে, আপনি যদি আমাকে বুঝতে না চান তবে মাইএসকিউএলে গ্রুপিং কীভাবে কাজ করে সে সম্পর্কে আরও পড়ুন, এটি খুব সহজ।

এবং শেষ অবধি, এখানে আরও একটি সাধারণ, তবুও বৈধ কোয়েরি।
আপনি যদি উপলভ্য বয়স অনুসারে মোট ব্যবহারকারীর সংখ্যা জিজ্ঞাসা করতে চান তবে আপনি এই ক্যোয়ারীটি লিখতে চাইতে পারেন

SELECT `age`, COUNT(`age`) FROM `users` GROUP BY `age`;

মাইএসকিউএল বিধি মোতাবেক যা পুরোপুরি বৈধ।
ইত্যাদি।

সমস্যাটি আসলে কী তা বোঝা গুরুত্বপূর্ণ এবং তারপরেই সমাধানটি লিখুন।


এই সুন্দর উত্তরের জন্য ধন্যবাদ। আমি যদি ফলাফলের গোষ্ঠীতে একটি অ্যারে হিসাবে ইমেলগুলিও চাই?
জোশিয়ার

1
আপনি সেখানে প্রতিটি প্রবেশের জন্য সর্বদা GROUP_CONCAT ক্ষেত্রের প্রয়োজন।
আব্রাহাম তুগালভ

উহু! সুতরাং একটি উপায় আছে! দয়া করে এই প্রশ্নে
জোশিয়ার

এই দুর্দান্ত উত্তরের জন্য ধন্যবাদ। আমি যদি করতে চাই GROUP BY DAY(created_date)? দেখে মনে হচ্ছে এটি DAY()যুক্ত হলে এটি কাজ করে না ।
ইসকিমো

41

আমি লারাভেল 5.3, মাইএসকিএল 5.7.12 ব্যবহার করছি, ল্যারাভেল হোমস্টেডে (0.5.0, আমি বিশ্বাস করি)

এমনকি পরিষ্কারভাবে সম্পাদনাটি /etc/mysql/my.cnfপ্রতিফলিত করার জন্য সেট করার পরেও :

[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

আমি তখনও ত্রুটিটি পাচ্ছিলাম।

আমি পরিবর্তন করতে হয়েছিল config/database.phpথেকে trueথেকে false:

    'mysql' => [
        'strict' => false, //behave like 5.6
        //'strict' => true //behave like 5.7
    ], 

আরও পড়া:

https://laracasts.com/discuss/channels/servers/set-set-sql-mode-on-homestead https://mattstauffer.co/blog/strict-mode-and-other-mysql-customizations-in-laravel -5-2


Dang! লারাভেল ব্যবহারকারীদের জন্য এটি সহায়ক ছিল। তার জন্য +1।
ওকাফোর টি কোসিসো

20

আপনি যদি ওয়্যাম্প 3.0.০..6 বা স্থিতিশীল 2.5 ব্যতীত অন্য কোনও উচ্চতর সংস্করণ ব্যবহার করে থাকেন তবে আপনি প্রথমে সমস্যাটি স্কয়ারের সাথে করতে পারেন। আপনার সেই অনুযায়ী ক্ষেত্রগুলির নাম লিখতে হবে। তবে আরও একটি উপায় আছে যার মাধ্যমে আপনি এটি সমাধান করতে পারেন। wamp এর সবুজ আইকনে ক্লিক করুন। mysql-> mysql সেটিংস-> sql_mode-> কিছুই নেই। বা কনসোল থেকে আপনি ডিফল্ট মান পরিবর্তন করতে পারেন।

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';

চমত্কার, তিনি যা বলেছিলেন তার উপর show variables like '%sql_mode%';ভিত্তি করে, মাইএসকিএল কমান্ড লাইনে কমান্ড সন্নিবেশ করুন , sql_mode সেটিংটি উন্মোচিত হবে
জেড হান

19

ফাইলটিতে লাইন যুক্ত (নীচে উল্লেখ করুন): /etc/mysql/my.cnf

[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

আমার জন্য ভাল কাজ। সার্ভার সংস্করণ: 5.7.18-0ubuntu0.16.04.1 - (উবুন্টু)


1
আপনি আরডিএস ব্যবহার করছেন?
মুবাশির পাওলে

@ মুবাশিরপোলে নং
জগদীপ সিং

16

Mysql বা phpmyadmin এ যান এবং ডাটাবেস নির্বাচন করুন তারপরে কেবল এই কোয়েরিটি সম্পাদন করুন এবং এটি কাজ করবে। এটা আমার জন্য কাজ করে।

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

দুর্দান্ত..ধন্যবাদ :)
মোহিতসচিন 217

আমার আনন্দ :) @ মোহিত
অনিল গুপ্ত

ধন্যবাদ আমাকে অনেক সময় বাঁচিয়েছে।
জোরেড

1
ভাই @ থারিন্দু ইরঙ্গা
অনিল গুপ্ত

1
তবে সমাধানের সাথে সমস্যাটি প্রতিবারই যখন আমি মাইএসকিএল পুনরায় চালু করি তখন আমার আবার ক্যোয়ারী চালানো দরকার। এর অর্থ সমাধানটি স্থায়ী বা অবিচল নয়।
মুশফিকুর রহমান

10

ম্যাকের জন্য:

1. /etc/my.cnf- এ ডিফল্ট my-default.cnf অনুলিপি করুন

sudo cp $(brew --prefix mysql)/support-files/my-default.cnf /etc/my.cnf

আপনার পছন্দসই সম্পাদকটি ব্যবহার করে my.cnf এ sql_mode পরিবর্তন করুন এবং এটিতে সেট করুন to

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.server restart

ধন্যবাদ, আমার জন্যও কাজ করেছেন। তবে আমি ম্যাকের মাইএসকিএল ডিফল্ট ব্যবহার করি, তাই আমার কাছে মাতাল পথ নেই। জাস্ট sudo সিপি আমার- default.cnf /etc/my.cnf
মাইক Nguyen

2
@ মাইকে এনগুইন সুডো সিপি / ওএসআর /লোকাল / মাইএসকিএল-5.7.17-macos10.12-x86_64/support-files/my-default.cnf /etc/my.cnf sudo vi /etc/my.cnf সেট করুন sql_model এসকিএল_মোড = স্ট্রাইক_এসটিএলএএনএলবিএস , NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION মাইএসকিউএল সার্ভার পুনরায় চালু করুন।
ইয়ং গাও

7

এটিই আমাকে পুরো বিষয়টি বুঝতে সাহায্য করেছে:

  1. https://stackoverflow.com/a/20074634/1066234
  2. https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

এবং সমস্যাযুক্ত ক্যোয়ারির নিম্নলিখিত উদাহরণে।

সমস্যাযুক্ত:

SELECT COUNT(*) as attempts, SUM(elapsed) as elapsedtotal, userid, timestamp, questionid, answerid, SUM(correct) as correct, elapsed, ipaddress FROM `gameplay`
                        WHERE timestamp >= DATE_SUB(NOW(), INTERVAL 1 DAY)
                        AND cookieid = #

এটিকে শেষের দিকে যুক্ত করে সমাধান করা:

  GROUP BY timestamp, userid, cookieid, questionid, answerid, elapsed, ipaddress

দ্রষ্টব্য: পিএইচপি-তে ত্রুটি বার্তাটি দেখুন, সমস্যাটি কোথায় রয়েছে তা আপনাকে জানায়।

উদাহরণ:

মাইএসকিউএল কোয়েরি ত্রুটি 1140: GROUP BY ব্যতীত সমষ্টিগত ক্যোয়ারিতে, নির্বাচনী তালিকার # 4 এক্সপ্রেশনটিতে অবৈধ কলাম 'db.gameplay.timestamp' রয়েছে; এটি বর্গক্ষেত্র_মোড = শুধুমাত্র_ফুল_গোষ্ঠী_এর সাথে বেমানান - প্রশ্ন: প্রয়াস হিসাবে COUNT (*) নির্বাচন করুন, এসইউএম (অতিবাহিত) হিসাবে প্রযোজ্য, ইউজারিড, টাইমস্ট্যাম্প, প্রশ্নি, উত্তরদাতা, এসইউএম (সঠিক) হিসাবে সঠিক, বর্ধিত, আইপ্রেড ফ্রি গেমপ্লে WHERE টাইমস্ট্যাম্প> = (এখন (), ইন্টারভাল 1 দিন) এবং ইউজারিড = 1

এই ক্ষেত্রে, গ্রুপ # 4 দ্বারা অভিব্যক্তিটি অনুপস্থিত ছিল।


1
ইশারা জন্য ধন্যবাদ stackoverflow.com/questions/20074562/...
cwhsu

এই সমস্যাটি সমাধানের দুর্দান্ত উত্তর। আপনাকে অনেক ধন্যবাদ
হানসানা আথুকোরালা

7

লোকালহোস্ট / ওয়্যাম্পসভার 3-এর জন্য আমরা এই ত্রুটিটি সরাতে স্ক্যুয়াল-মোড = ব্যবহারকারী_মড সেট করতে পারি:

click on wamp icon -> MySql -> MySql Setting -> sql-mode -> user_mode

তারপরে wamp বা অ্যাপাচি পুনরায় চালু করুন


1
আমি জানি এটি এই সমস্যার দীর্ঘমেয়াদী সমাধান নাও হতে পারে তবে এটি অবশ্যই আপাতত সহায়তা করেছে। আমার হোস্টিং সংস্থা, গো বাবা এই দ্রুত সমাধানের সমাধানের জন্য ধন্যবাদ
অ্যালান এন

4

আপনি একটি যোগ করতে পারেন unique indexথেকে group_id; আপনি যদি নিশ্চিত হন যে group_idএটি অনন্য।

এটি ক্যোয়ারী পরিবর্তন না করে আপনার কেস সমাধান করতে পারে

একটি দেরী উত্তর, কিন্তু এটি এখনও উত্তর উল্লেখ করা হয় নি। সম্ভবত এটি ইতিমধ্যে উপলব্ধ বিস্তৃত উত্তরগুলি সম্পূর্ণ করা উচিত। কমপক্ষে এটি আমার ক্ষেত্রে সমাধান করেছে যখন আমাকে অনেকগুলি ক্ষেত্রের সাথে একটি টেবিল বিভক্ত করতে হয়েছিল।


2

আপনার সাথে এই ত্রুটি থাকে তাহলে Symfony ব্যবহার মতবাদ ক্যোয়ারী রচয়িতা , এবং এই ত্রুটি একটি দ্বারা ঘটিত হয় যদি orderBy :

আপনি selectযে কলামটি চান তাতে মনোযোগ দিন groupByএবং এর addGroupByপরিবর্তে ব্যবহার করুন groupBy:

$query = $this->createQueryBuilder('smth')->addGroupBy('smth.mycolumn');

Symfony3 এ কাজ করে -


1

আপনার সঠিক এসকিউএল ব্যবহার না করার জন্য দুঃখিত

আমি এই ক্যোয়ারীটি মাইএসকিএল সতর্কতাটি কাটিয়ে উঠতে ব্যবহার করেছি।

SELECT count(*) AS cnt, `regions_id`
FROM regionables 
WHERE `regionable_id` = '115' OR `regionable_id` = '714'
GROUP BY `regions_id`
HAVING cnt > 1

আমার থাকার চাবিটি নোট করুন

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