মাইএসকিউএল ব্যতীত সমস্ত কলাম নির্বাচন করবেন?


365

আমি ব্যতীত একটি নির্দিষ্ট মাইএসকিউএল টেবিল থেকে সমস্ত কলাম পেতে একটি নির্বাচিত বিবৃতি ব্যবহার করার চেষ্টা করছি। এটি করার কোন সহজ পথ আছে কি?

সম্পাদনা করুন: এই টেবিলটিতে 53 টি কলাম রয়েছে (আমার নকশা নয়)


6
53 কলাম? থমাস যেভাবে পরামর্শ দিয়েছিল আমি সেলেক্ট * দিয়ে থাকব ... যদি না সেই অতিরিক্ত কলামে প্রচুর পরিমাণে ডেটা থাকে যা পুনরুদ্ধারে অনাকাঙ্ক্ষিত হবে ...?
মাইক স্টোন

একটি কলাম ব্যতীত ... আমি মনে করি আপনি জানেন যে কোনটি অগ্রাহ্য করা উচিত, সুতরাং তথ্য INFORMATION_SCHEMA.c কলামগুলি।
আলফাব্রাভো

এই উত্তরটি যাচাই করে দেখুন আপনি যা করতে চান তা করে!
ডোনএল

যখন ভৌগলিক ডেটা রাখা হয় তখন বড় ডেটা কলামটি একটি আসল সমস্যা। কলামগুলি আকারে অনেকগুলি মেগাবাইট হতে পারে। সারিগুলি সন্ধান করার জন্য ক্লোজগুলি যেখানে তারা ভাল কাজ করে তবে আপনি প্রায়শই ফলাফলগুলিতে সেই ডেটাটি চান না।
জেসন

এর সাধারণ ব্যবহার হ'ল স্বয়ংক্রিয় বৃদ্ধি আইডি কলাম বাদ দেওয়া। উদাহরণস্বরূপ, একটি আলাদা টেবিলের মধ্যে প্রবেশ করতে ডেটা নির্বাচন করতে, যার নিজস্ব আইডি রয়েছে।
নির্মাতা স্টিভ

উত্তর:


222

আসলে একটি উপায় আছে, এটি করার জন্য আপনার অবশ্যই অবশ্যই অনুমতি থাকা দরকার ...

SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<columns_to_omit>,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table>' AND TABLE_SCHEMA = '<database>'), ' FROM <table>');

PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

প্রতিস্থাপন করা হচ্ছে <table>, <database> and <columns_to_omit>


20
সতর্কবাণী: INFORMATION_SCHEMA ক্যোয়ারীগুলির বেশ খারাপ পারফরম্যান্স রয়েছে, তাই সাবধান হন এই ধরণের কোয়েরি কোনও কিছুর জন্য সমালোচনামূলক পথে না চলে।
বিল কারভিন

9
@ জন কোরিটাক নীচে বলেছিলেন যে, এই উত্তরটি আসলে কাজ করে না যদি আপনি যে শিরোনামের কলামগুলি মুছে ফেলতে চান সেগুলিও আপনি রাখতে চান যে কোনও কলামের জন্য শিরোনামের একটি সাব-স্ট্রিং। এর মতো আরও ভাল উত্তর রয়েছে যা এখানে পাওয়া যাবে
ডোনএল

8
এটি কলামগুলি নির্দিষ্ট করার চেয়েও খারাপ, যা একটি পরিচিত সেরা অনুশীলন।
এইচএলজিইএম

3
কলামের নামগুলিতে শূন্যস্থান থাকলে এটি কাজ করে না। নামগুলি সর্বদা ব্যাকটিক্সে ঘিরে আপডেট করা উচিত<column_name>
অ্যাডামএফ

3
টেবিল কাঠামোর তালিকাভুক্ত কলামটি তালিকাভুক্ত করা শেষটি (যদি প্রতিস্থাপনটি পেছনের কোমায় মেলে না তবে) এটি কাজ করবে না।
ভিনসেন্ট প্যাসেলার 13

61

মাইএসকিএল সংজ্ঞায় (ম্যানুয়াল) তেমন কোনও জিনিস নেই। তবে আপনার যদি সত্যিই বড় সংখ্যক কলাম থাকে col1, ...,, col100নিম্নলিখিতগুলি কার্যকর হতে পারে:

DROP TABLE IF EXISTS temp_tb;
CREATE TEMPORARY TABLE ENGINE=MEMORY temp_tb SELECT * FROM orig_tb;
ALTER TABLE temp_tb DROP col_x;
SELECT * FROM temp_tb;

4
তৃতীয় ধাপে আমাকে ত্রুটি বার্তাটি দিয়েছে: "কলামের গণনা সারি 1 এ মান গণনার সাথে মেলে না"। সুতরাং আমি পদক্ষেপ 2 পরিবর্তন করে "আপডেটের তারিখ_তালিকা সেট আইডি = NULL" করেছি এবং তারপরে এটি কার্যকর হয়েছে।
ওয়েউই

1
ঠিক আছে, এটি কাজ করে। কিন্তু যখন আমি এই ক্যোয়ারীটি আবার চালাচ্ছি, এটি আমাকে একটি ত্রুটি দেয়, এটি, টেম্প_টিবিটি ইতিমধ্যে বিদ্যমান। কতক্ষণের জন্য টেম্প_টিবি স্মৃতিতে থাকে? এটি একটি বোকা প্রশ্ন যদি ক্ষমা চাই। পিএস আপনার উত্তর upvated।
করণ

2
@ করণ এই ক্যোয়ারীটি বারবার চালাতে, আরম্ভ করার জন্য আর একটি কমান্ড যুক্ত করুন:DROP TABLE IF EXISTS temp_tb;
গ্রেগন 3

1
@ করান মেমরি ইঞ্জিন নির্দিষ্ট করতে, কমান্ডটি ব্যবহার করুন: CREATE TEMPORARY TABLE temp_tb ENGINE=MEMORY (SELECT * FROM orig_tb); অন্যথায় এটি ডিফল্টরূপে ডিস্কে সংরক্ষিত হয় এবং একটি সার্ভার পুনঃসূচনা থেকে বেঁচে থাকে। ( ধন্যবাদ )
গ্রেগন 3

দুর্দান্ত উত্তর। জন্য একাধিক কলাম ড্রপ , পড়ুন এই উত্তর
S3DEV

45

এই ক্ষেত্রে কি কোনও ভিউ আরও ভাল কাজ করবে?

CREATE VIEW vwTable
as  
SELECT  
    col1  
    , col2  
    , col3  
    , col..  
    , col53  
FROM table

15
হা হা! হ্যা অবশ্যই. এখন আপনি কীভাবে কলামগুলির মধ্যে সমস্ত বিট বিট অন্তর্ভুক্ত করতে ভিউটি তৈরি করবেন। আমি মনে করি আপনি কীভাবে এটি আসল প্রশ্নটি ভিক্ষা করেন। প্রকৃতপক্ষে, আমি এই থ্রেডটি বিশেষভাবে খুঁজে পেয়েছি কারণ আমি এমন একটি দৃষ্টিভঙ্গি তৈরি করতে চেয়েছিলাম যা দৃশ্যের সংজ্ঞায় স্পষ্টভাবে বাকী সমস্ত কলামকে তালিকাবদ্ধ করতে বাধ্য না করে নির্দিষ্ট কলামগুলি বাদ দেয়।
ক্রিস নাদোভিচ

31

আপনি করতে পারেন:

SELECT column1, column2, column4 FROM table WHERE whatever

কলাম 3 না পেয়ে, সম্ভবত আপনি আরও সাধারণ সমাধানের সন্ধান করছেন?


3
বেশিরভাগ উচ্চতর রেট করা উত্তরগুলি কেবল হাত দিয়ে টাইপ না করে এই সঠিক ক্যোয়ারী উত্পন্ন করার উপায়গুলি খুঁজে বের করে
মেহতুঙ্গুহ

5
প্রকৃতপক্ষে রক্ষণাবেক্ষণের কারণে, "ধরণের ব্যতীত সমস্ত কিছুর" ক্যোয়ারী থাকা দরকারী। অন্যথায় সুস্পষ্ট ক্ষেত্র তালিকাগুলি আপডেট করতে হবে যদি পরে নতুন ক্ষেত্রগুলি যুক্ত করা হয়।
লিওভাওয়া

1
@ উপরে, এটি সঠিক এবং তারা হওয়া উচিত !!! আপনি ভবিষ্যতের কলামগুলি রাখতে চান কিনা তা আপনি জানেন না (সেগুলি মেটা ডেটা কলাম বা একটি নির্দিষ্ট স্ক্রিনে প্রযোজ্য নয় এমন হতে পারে)। আপনি না; আপনার প্রয়োজনের চেয়ে বেশি ফিরিয়ে দিয়ে পারফরম্যান্সের ক্ষতি করতে চান (যা আপনার অভ্যন্তরীণ যোগদানের সময় 100% সত্য) আমি আপনাকে * এসকিউএল অ্যান্টিপ্যাটার্ন নির্বাচন করার কারণে কেন কিছু পড়ার পরামর্শ দিচ্ছি?
এইচএলজিএম

26
ওপিতে সেখানে বলা হয়েছে> 50 টি কলাম রয়েছে তাই এটি বরং অবৈধ।
আগস্ট

1
@ এইচএলজিইএম সত্যিই নয়, আমি প্রত্যেকবারই একটি নতুন কলাম যুক্ত করার পরে, ক্যোয়ারী না রেখেই সমস্ত কলামগুলি নির্বাচন করতে চেয়েছিলাম, এবং এটি কেবল আমার ক্ষেত্রে কার্যকর হবে না। তবে যাইহোক আমি নিজের জন্য শন ও এর সমাধান প্রয়োগ করেছি
ওভারকোডার

26

আপনি যদি কোনও ক্ষেত্রের মান বাদ দিতে চান, যেমন সুরক্ষা উদ্বেগ / সংবেদনশীল তথ্যের জন্য, আপনি এই কলামটি শূন্য হিসাবে পুনরুদ্ধার করতে পারেন।

যেমন

SELECT *, NULL AS salary FROM users

13
কেন? এটি কাজ করে না। আপনার যদি কলামের বেতন থাকে তবে এই ক্যোয়ারির ফলাফলটি শেষ হবে দু'টি কলামের নাম বেতনের, একটি শূন্যস্থান পূর্ণ এবং একটি আসল বেতন সহ।
মাইফরভিক

4
@ মাইফরওয়িক এই ক্যোয়ারীটি সত্যই দ্বিতীয় salaryকলাম যুক্ত করে। তবে এটি * এর পরে পুনরুদ্ধার করা হয়েছে, এটি মূলটিকে ওভাররাইট করে। এটি সুন্দর নয়, তবে এটি কাজ করে।
শান হে

67
এসকিউএল সর্বদা একটি ফলাফল-সেটে সদৃশ কলামের নামগুলি মঞ্জুর করে। আপনি যদি এটি কাজ করতে চান তবে আপনাকে এটি ক্লায়েন্ট অ্যাপ্লিকেশন দিয়ে চালানো দরকার যা দুপসকে সমর্থন করে না এবং শেষ ডুপকে অগ্রাধিকার দেয়। অফিসিয়াল কমান্ড-লাইন ক্লায়েন্ট dupes সমর্থন করে। HeidiSQL পাশাপাশি তাদের সমর্থন করে। এসকিউএল ফিডল তা করেন না, তবে প্রথম ডুপ্প প্রদর্শন করে , শেষ নয়। সংক্ষেপে: এটি কাজ করে না
আলভারো গঞ্জালেজ

9
অবশ্যই এটি কাজ করে না। এটি মাইএসকিএলে কথা বলার পাঠাগারগুলির পরিবর্তে মাইএসকিএলে আপনার উত্তরগুলি কেন পরীক্ষা করা উচিত তার একটি দুর্দান্ত উদাহরণ example
মাইফরভিক

8
@ সিয়ানো, @ অ্যালিস্টার, @ সবাই, ওভাররাইড করে না। সার্ভারটি এখনও সংবেদনশীল ডেটা ফেরত দেয়।
পেসারিয়ার

22

আমার জ্ঞানের সেরা, সেখানে না। আপনি যেমন কিছু করতে পারেন:

SELECT col1, col2, col3, col4 FROM tbl

এবং ম্যানুয়ালি আপনি যে কলামগুলি চান তা চয়ন করুন। তবে, আপনি যদি অনেকগুলি কলাম চান, তবে আপনি কেবল একটি করতে চাইতে পারেন:

SELECT * FROM tbl 

এবং আপনি যা চান না কেবল তা উপেক্ষা করুন।

আপনার বিশেষ ক্ষেত্রে, আমি পরামর্শ দেব:

SELECT * FROM tbl

যদি না আপনি কেবল কয়েকটি কলাম চান। আপনি যদি কেবল চারটি কলাম চান, তবে:

SELECT col3, col6, col45, col 52 FROM tbl

ঠিক আছে, তবে আপনি যদি 50 টি কলাম চান, তবে যে কোনও কোড যা ক্যোয়ারী তৈরি করে তা (খুব?) পড়া শক্ত হয়ে যায়।


3
নির্বাচন করুন * সর্বদা একটি দরিদ্র পছন্দ। এটি সুপারিশ করবেন না। এটি কেন একটি এসকিউএল অ্যান্টিপ্যাটার্ন on
এইচএলজিইএম

18

@ মহোমেদালিড এবং @ জুনাইদ দ্বারা সমাধানগুলি চেষ্টা করার সময় আমি একটি সমস্যা পেয়েছি। তাই ভাগ করে নেওয়ার কথা ভেবেছি। যদি কলামের নামটিতে ফাঁকা জায়গা বা চেক-ইনয়ের মতো হাইফেন থাকে তবে ক্যোয়ারী ব্যর্থ হবে। কলামের নামগুলির চারপাশে ব্যাকটিক ব্যবহার করা সহজ কাজ। পরিবর্তিত ক্যোয়ারী নীচে রয়েছে

SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(CONCAT("`", COLUMN_NAME, "`")) FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;

11

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


9

আপনি My_table DESCRIBE ব্যবহার করতে পারেন এবং তার ফলাফলগুলিকে গতিশীলভাবে নির্বাচন নির্বাচন বিবরণ উত্পন্ন করতে ব্যবহার করতে পারেন ।


8

আমার মূল সমস্যাটি হ'ল টেবিলগুলিতে যোগদানের পরে আমি যে কলামগুলি পেয়েছি তা। যদিও এটি আপনার প্রশ্নের উত্তর নয় ( এক টেবিল থেকে সমস্ত কলামগুলি বাদে কীভাবে নির্বাচন করবেন ), আমি মনে করি এটি উল্লেখযোগ্য যে কেবল নির্দিষ্ট করার পরিবর্তে আপনি একটি নির্দিষ্ট টেবিল থেকে সমস্ত কলামগুলি পেতে নির্দিষ্ট করতে পারেনtable.

এটি কীভাবে খুব কার্যকর হতে পারে তার একটি উদাহরণ এখানে দেওয়া হয়েছে:

ব্যবহারকারী নির্বাচন করুন। *, ফোন.মেটা_ভ্যালু ফোন হিসাবে, পিনকোড হিসাবে zipcode.meta_value

ব্যবহারকারীদের কাছ থেকে

ফোন হিসাবে ব্যবহারকারী_মেটাতে বামে যোগদান করুন
চালু ((ব্যবহারকারী.উজার_আইডি = ফোন.ইউজার_আইডি) এবং (ফোন.মেটা_কি = 'ফোন'))

বাম ইউজার_মেটা জিপকোড হিসাবে যোগদান করুন
অন ​​((ইউজার.ইউজার_আইডি = জিপকোড.ইউজার_আইডি) এবং (জিপকোড.মেটা_কি = 'জিপকোড'))

ফলাফলটি হ'ল ব্যবহারকারীর টেবিলের সমস্ত কলাম এবং মেটা টেবিল থেকে যোগ হওয়া দুটি অতিরিক্ত কলাম।


2
আপনাকে ধন্যবাদ, আমাকে যোগদানের ক্ষেত্রে প্রথম টেবিলের সমস্ত কলাম এবং দ্বিতীয় টেবিল থেকে কেবল একটি ক্ষেত্র নির্বাচন করতে হবে এবং আপনার উত্তর আমাকে সাহায্য করেছে।
মোহাম্মদ ফালাহাট

5

আমি @Mahomedalidএই মন্তব্যটি থেকে মন্তব্যে অবহিত করা ছাড়াও উত্তরটি পছন্দ করেছি @Bill Karwin। উত্থাপিত সম্ভাব্য সমস্যাটি @Jan Koritakসত্য যে আমি এটির মুখোমুখি হয়েছি তবে আমি এর জন্য একটি কৌশল খুঁজে পেয়েছি এবং যে কেউ সমস্যাটির মুখোমুখি হচ্ছে তাদের জন্য এটি এখানে ভাগ করে নিতে চাই।

আমরা রেপ্লেস ফাংশনটি প্রতিস্থাপন করতে পারি যেখানে প্রিপারেটেড স্টেটমেন্টের সাব-কোয়েরিতে এই জাতীয় ধারা রয়েছে:

আমার টেবিল এবং কলামের নাম ব্যবহার করে

SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;

সুতরাং, এটি কেবল ক্ষেত্রটি বাদ দিচ্ছে idকিন্তু নয়company_id


4

আপনি সমস্ত কলামগুলি জিজ্ঞাসা করলেও আপনি যে কলামগুলি জিজ্ঞাসা করছেন তা নির্দিষ্ট করে দেওয়া ভাল অনুশীলন।

সুতরাং আমি আপনাকে বিবৃতিতে প্রতিটি কলামের নাম লেখার পরামর্শ দিচ্ছি (যা আপনি চান না তা বাদ দিয়ে)।

SELECT
    col1
    , col2
    , col3
    , col..
    , col53

FROM table

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

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

4

শুধু কর

SELECT * FROM table WHERE whatever

তারপরে কলামটি আপনার প্রিয় প্রোগ্রামিংয়ের ভাষা: ড্রপ করুন

while (($data = mysql_fetch_array($result, MYSQL_ASSOC)) !== FALSE) {
   unset($data["id"]);
   foreach ($data as $k => $v) { 
      echo"$v,";
   }      
}

6
আপনি যে কলামটি বাদ দিতে চান না তা না হলে একটি বিশাল BLOB বা কিছু।
বিল কারভিন

1
যদি আপনি অপচয় করা ডেটা এড়াতে চেষ্টা করেন তবে এটি খারাপ।
ক্রিস্টোফার ইভস 20

53 থেকে 1 কলামে কোনও পার্থক্য করা উচিত নয়। যদি এটি করে তবে এটি সম্ভবত একটি খারাপ নকশা।
পেট্র পেলার

1
নির্বাচন * একটি এসকিউএল অ্যান্টিপ্যাটার্ন এবং প্রডাকশন কোডে কখনই কাঁটা ব্যবহার করা উচিত নয়।
এইচএলজিইএম

1
আমি সম্মত হই না যে নির্বাচন * হ'ল একধরণের অ্যান্টি-প্যাটার্ন যা উত্পাদন কোডে "কখনই" ব্যবহার করা উচিত নয়। এটি আরও স্পষ্ট যে আপনি আপনার সমস্ত কলামগুলি পুনরুদ্ধার করেছেন - কলামের দীর্ঘ তালিকার ক্রস-রেফারেন্সের তুলনায় যেগুলি আসলে সমস্ত ক্ষেত্রই হতে পারে বা না পারে। এটি খুব স্পষ্টতই কোডের চেয়ে দ্রুততরও। এবং অনেকগুলি রয়েছে, যেখানে টেবিলের ক্ষেত্রগুলি কোনও দৃশ্যে বা আকারে ক্ষেত্রগুলির সাথে হুবহু মিলে যায়।
জেফ কেন্ডল

4

আমি সমস্ত কলামগুলি তালিকাভুক্ত করার "সহজ" সমাধানের সাথে একমত, তবে এটি বোঝাজনক হতে পারে এবং টাইপসগুলি প্রচুর অপচয় করার কারণ হতে পারে। আমি কোয়েরিতে আটকানোর জন্য উপযুক্ত আমার কলামগুলির নামগুলি পুনরুদ্ধার করতে একটি ফাংশন "গেটবেল কলম" ব্যবহার করি। তারপরে আমাকে যা করতে হবে তা হ'ল আমি চাই না তাদের মুছতে।

CREATE FUNCTION `getTableColumns`(tablename varchar(100)) 
          RETURNS varchar(5000) CHARSET latin1
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE res  VARCHAR(5000) DEFAULT "";

  DECLARE col  VARCHAR(200);
  DECLARE cur1 CURSOR FOR 
    select COLUMN_NAME from information_schema.columns 
    where TABLE_NAME=@table AND TABLE_SCHEMA="yourdatabase" ORDER BY ORDINAL_POSITION;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  OPEN cur1;
  REPEAT
       FETCH cur1 INTO col;
       IF NOT done THEN 
          set res = CONCAT(res,IF(LENGTH(res)>0,",",""),col);
       END IF;
    UNTIL done END REPEAT;
  CLOSE cur1;
  RETURN res;

আপনার ফলাফল একটি কমা বিস্মৃত স্ট্রিং প্রদান করে, উদাহরণস্বরূপ ...

col1, col2, col3, col4 ... col53



4

হ্যাঁ, যদিও এটি টেবিলের উপর নির্ভর করে এটি উচ্চ আই / ও হতে পারে তবে এটির জন্য আমি খুঁজে পেয়েছি ar

SELECT *
INTO #temp
FROM table

ALTER TABLE #temp DROP COlUMN column_name

SELECT *
FROM #temp

এটি যে কোনও মাঝারি আকারের টেবিলের জন্য মারাত্মকভাবে ধীর হবে।
জোয়েল

3

আমি সম্মত হই যে এটি অন্য পর্যায়ে Select *উল্লিখিত যেমন আপনার প্রয়োজন না হয় তবে এটিই যথেষ্ট নয় , আপনি এই ওভারহেড ক্রাইপটি রাখতে চান না।

আমি প্রয়োজনীয় ডেটা দিয়ে একটি ভিউ তৈরি করব , তবে আপনি Select *স্বাচ্ছন্দ্যে পারেন - যদি ডেটাবেস সফ্টওয়্যার তাদের সমর্থন করে। অন্যথায়, বিশাল তথ্যটি অন্য টেবিলে রাখুন।


3

প্রথমে আমি ভেবেছিলাম আপনি নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারেন তবে আমি এমওয়াইএসকিউএল ডক্সটি পড়ছি বলে মনে হয় আপনি পারবেন না। আমি যদি আপনি হয়ে থাকি তবে আপনি যে কলামগুলি পেতে চান তার একটি তালিকা তৈরি করতে, অন্য একটি ভাষা (যেমন পিএইচপি) ব্যবহার করতাম, এটি একটি স্ট্রিং হিসাবে সঞ্চয় কর এবং তারপরে এসকিউএল উত্পন্ন করার জন্য এটি ব্যবহার করতাম।


3

আমি এটিও চেয়েছিলাম তাই আমি পরিবর্তে একটি ফাংশন তৈরি করেছি।

public function getColsExcept($table,$remove){
    $res =mysql_query("SHOW COLUMNS FROM $table");

    while($arr = mysql_fetch_assoc($res)){
        $cols[] = $arr['Field'];
    }
    if(is_array($remove)){
        $newCols = array_diff($cols,$remove);
        return "`".implode("`,`",$newCols)."`";
    }else{
        $length = count($cols);
        for($i=0;$i<$length;$i++){
            if($cols[$i] == $remove)
                unset($cols[$i]);
        }
        return "`".implode("`,`",$cols)."`";
    }
}

সুতরাং এটি কীভাবে কাজ করে তা হল আপনি টেবিলটি প্রবেশ করুন, তারপরে একটি কলাম আপনি চান না বা অ্যারের মতো: অ্যারে ("আইডি", "নাম", "যাই হোক না কেন কলাম")

সুতরাং নির্বাচনের ক্ষেত্রে আপনি এটি এটির মতো ব্যবহার করতে পারেন:

mysql_query("SELECT ".$db->getColsExcept('table',array('id','bigtextcolumn'))." FROM table");

অথবা

mysql_query("SELECT ".$db->getColsExcept('table','bigtextcolumn')." FROM table");

3

আমি @ মাহমোদ্দিনের জবাবের সাথে একমত, তবে আমি প্রস্তুত বিবৃতির মতো কিছু করতে চাইনি এবং আমি সমস্ত ক্ষেত্র টাইপ করতে চাইনি, তাই আমার যা ছিল তা নির্বোধ সমাধান।

Phpmyadmin-> sql-> সিলেক্ট করে টেবিলটিতে যান, এটি ক্যোরিটিকে ডাম্প করে: অনুলিপি করুন, প্রতিস্থাপন করুন এবং সম্পন্ন করুন! :)


2

আমি থমাসের উত্তর (+1;) এর সাথে একমত হওয়ার পরে, আমি যে সাবধানবাণীটি যুক্ত করতে চাইব যে কলামটি আপনি চাইবেন না তাতে আমি খুব কমই কোনও ডেটা ধারণ করব। যদি এতে প্রচুর পরিমাণে পাঠ্য, এক্সএমএল বা বাইনারি ব্লব থাকে তবে প্রতিটি কলাম পৃথকভাবে নির্বাচন করতে সময় নিন। আপনার অভিনয় অন্যথায় ক্ষতিগ্রস্থ হবে। চিয়ার্স!


2

মাহোমাদিদ পোস্ট করা উত্তরে একটি ছোট সমস্যা রয়েছে:

অভ্যন্তরীণ ফাংশন কোডটির পরিবর্তে " <columns_to_delete>," " " দ্বারা "প্রতিস্থাপন করা হয়েছিল, এই প্রতিস্থাপনটিতে সমস্যা আছে যদি প্রতিস্থাপনের ক্ষেত্রটি শেষ একের সাথে কনক্যাট স্ট্রিংয়ের শেষের সাথে চর কমা না থাকলে", "এবং এখান থেকে সরানো হয় না স্ট্রিং।

আমার প্রস্তাব:

SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME),
                  '<columns_to_delete>', '\'FIELD_REMOVED\'')
           FROM INFORMATION_SCHEMA.COLUMNS
           WHERE TABLE_NAME = '<table>'
             AND TABLE_SCHEMA = '<database>'), ' FROM <table>');

প্রতিস্থাপন <table>, <database>এবং `

সরানো কলামটি আমার ক্ষেত্রে "FIELD_REMOVED" স্ট্রিং দ্বারা প্রতিস্থাপিত হয়েছে এটি কাজ করে কারণ আমি মেমরি নিরাপদ করার চেষ্টা করছিলাম। (যে ক্ষেত্রটি আমি সরিয়েছিলাম তা হ'ল প্রায় 1MB এর একটি ব্লক)


2

@ মহোমডিডাল উত্তরের ভিত্তিতে, "মাইএসকিএল ব্যতীত সমস্ত কলাম নির্বাচন করুন" সমর্থন করার জন্য আমি কিছু উন্নতি করেছি

SET @database    = 'database_name';
SET @tablename   = 'table_name';
SET @cols2delete = 'col1,col2,col3';

SET @sql = CONCAT(
'SELECT ', 
(
    SELECT GROUP_CONCAT( IF(FIND_IN_SET(COLUMN_NAME, @cols2delete), NULL, COLUMN_NAME ) )
    FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tablename AND TABLE_SCHEMA = @database
), 
' FROM ',
@tablename);

SELECT @sql;

আপনার কাছে প্রচুর কলস থাকলে, গ্রুপ_কনক্যাট_ম্যাক্স_লেন পরিবর্তন করতে এই এসকিএলটি ব্যবহার করুন

SET @@group_concat_max_len = 2048;

2

আমি হতে পারি জান কোরিটকের সুস্পষ্ট বৈষম্যের সমাধান হতে পারে

SELECT CONCAT('SELECT ',
( SELECT GROUP_CONCAT(t.col)
FROM
(
    SELECT CASE
    WHEN COLUMN_NAME = 'eid' THEN NULL
    ELSE COLUMN_NAME
    END AS col 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'
) t
WHERE t.col IS NOT NULL) ,
' FROM employee' );

সারণী:

SELECT table_name,column_name 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'

================================

table_name  column_name
employee    eid
employee    name_eid
employee    sal

================================

অনুসন্ধান ফলাফল:

'SELECT name_eid,sal FROM employee'

1

যদি এটি সর্বদা একই কলাম হয় তবে আপনি এমন একটি দর্শন তৈরি করতে পারেন যা এতে নেই।

নাহলে না, আমি তা মনে করি না।


1

আপনি এসকিউএল তৈরি করতে এসকিউএল ব্যবহার করতে পারেন যদি আপনি এটির যে এসকিউএল পছন্দ করেন এবং মূল্যায়ন করেন। এটি একটি সাধারণ সমাধান কারণ এটি তথ্য স্কিমা থেকে কলামের নামগুলি বের করে। এখানে ইউনিক্স কমান্ড লাইনের একটি উদাহরণ রয়েছে।

বদলে

  • MYSQL আপনার mysql কমান্ড সহ
  • টেবিলের নাম সহ টেবিল
  • বাদ দেওয়া মাঠের নাম সহ এক্সক্লুডেফিল্ড
echo $(echo 'select concat("select ", group_concat(column_name) , " from TABLE") from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1) | MYSQL

সেই কলামটি বাদ দেওয়া কলামের তালিকাটি তৈরি করার জন্য আপনাকে কেবল একবার এইভাবে কলামের নামগুলি বের করতে হবে এবং তারপরে আপনার নির্মিত ক্যোয়ারীটি কেবল ব্যবহার করতে হবে।

সুতরাং যেমন কিছু:

column_list=$(echo 'select group_concat(column_name) from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1)

এখন আপনি নিজের তৈরি করা $column_listপ্রশ্নের মধ্যে স্ট্রিংটি পুনরায় ব্যবহার করতে পারেন ।


1

এই সমস্যাটি সমাধান করার জন্য আমি অন্য দৃষ্টিকোণটি যুক্ত করতে চাই বিশেষত যদি আপনার কাছে খুব কম সংখ্যক কলাম অপসারণ করতে হয়।

আপনি মাইএসকিউএল ওয়ার্কবেঞ্চের মতো একটি ডিবি সরঞ্জাম ব্যবহার করতে পারেন জন্য নির্বাচিত বিবৃতি উত্পন্ন করতে আপনি , সুতরাং আপনাকে জেনারেটেড স্টেটমেন্টের জন্য সেই কলামগুলি ম্যানুয়ালি মুছে ফেলতে হবে এবং এটি আপনার এসকিউএল স্ক্রিপ্টে অনুলিপি করতে হবে।

মাইএসকিউএল ওয়ার্কবেঞ্চে এটি তৈরি করার উপায়টি হ'ল:

টেবিলের উপর রাইট ক্লিক করুন -> এসকিএল সম্পাদককে প্রেরণ করুন -> সমস্ত বিবৃতি নির্বাচন করুন।


1

গৃহীত উত্তরের বেশ কয়েকটি ত্রুটি রয়েছে।

  • এটি ব্যর্থ হয় যেখানে টেবিল বা কলামের নামগুলির ব্যাকটিকগুলি প্রয়োজন
  • আপনি বাদ দিতে চান কলামটি তালিকার শেষ যদি এটি ব্যর্থ হয়
  • এটির জন্য টেবিলের নামটি দুবার তালিকাভুক্ত করা দরকার (একবার নির্বাচনের জন্য এবং অন্যটি ক্যোয়ারী পাঠ্যের জন্য) যা অপ্রয়োজনীয় এবং অপ্রয়োজনীয়
  • এটি সম্ভাব্যভাবে ভুল ক্রমে কলামের নামগুলি ফিরিয়ে দিতে পারে

সব বিষয়গুলোকে কেবলমাত্র ব্যাকটিক অন্তর্ভুক্ত করে পরাস্ত করা যাবে SEPARATORআপনার জন্য GROUP_CONCATএবং ব্যবহার WHEREপরিবর্তে শর্ত REPLACE()। আমার উদ্দেশ্যে (এবং আমি আরও অনেকের কল্পনাও করি) আমি কলামের নামগুলি একই টেবিলে ফিরে আসতে চেয়েছিলাম যে তারা টেবিলে উপস্থিত হবে appear এটি অর্জনের জন্য, এখানে আমরা ফাংশনের ORDER BYঅভ্যন্তরে একটি স্পষ্ট ধারা ব্যবহার করি GROUP_CONCAT():

SELECT CONCAT(
    'SELECT `',
    GROUP_CONCAT(COLUMN_NAME ORDER BY `ORDINAL_POSITION` SEPARATOR '`,`'),
    '` FROM `',
    `TABLE_SCHEMA`,
    '`.`',
    TABLE_NAME,
    '`;'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE `TABLE_SCHEMA` = 'my_database'
    AND `TABLE_NAME` = 'my_table'
    AND `COLUMN_NAME` != 'column_to_omit';

0

আমার একটি পরামর্শ আছে তবে সমাধান নয়। যদি আপনার কিছু কলামে আরও বড় ডেটা সেট থাকে তবে আপনার নিম্নলিখিতটি দিয়ে চেষ্টা করা উচিত

SELECT *, LEFT(col1, 0) AS col1, LEFT(col2, 0) as col2 FROM table

-1

আমি এর জন্য একটি উত্তর বের করতে খুব দেরী করেছি, এটি আমি সর্বদা এটি করেছি এবং স্পষ্টভাবে বলছি, এটি সেরা উত্তরের চেয়ে ১০০ গুণ ভাল এবং আরও সুন্দর, আমি কেবল আশা করি যে কেউ এটি দেখতে পাবে। এবং এটি দরকারী মনে হয়

    //create an array, we will call it here. 
    $here = array();
    //create an SQL query in order to get all of the column names
    $SQL = "SHOW COLUMNS FROM Table";
        //put all of the column names in the array
        foreach($conn->query($SQL) as $row) {
            $here[] = $row[0];
        }
    //now search through the array containing the column names for the name of the column, in this case i used the common ID field as an example
    $key = array_search('ID', $here);
    //now delete the entry
    unset($here[$key]);

এটি সম্ভবত ঝরঝরে, তবে এটি প্রশ্নের উত্তর দেয় না: তিনি পিএইচপি সম্পর্কে জিজ্ঞাসা করেননি, এবং আপনি তার পছন্দসই বিবৃতি বা তিনি যা চান তার ফলাফল দেন না, তবে কেবল একটি পিএইচপি অ্যারে তিনি চান কলামগুলি রয়েছে।
gou1

2
-1। এটি এসকিউএল কোড নয়, এবং SELECTএখানে কোনও বিবৃতি নেই — শব্দটি একবারেও ঘটে না।
ফ্রুঙ্গি

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

-5

নির্বাচন করুন * একটি এসকিউএল অ্যান্টিপ্যাটার্ন। এটি অনেকগুলি কারণে প্রডাকশন কোডে ব্যবহার করা উচিত নয়:

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

এর অর্থ আপনি সম্ভবত প্রয়োজনের চেয়ে বেশি ডেটা প্রেরণ করছেন যা সার্ভার এবং নেটওয়ার্ক উভয়ই বাধা সৃষ্টি করে। যদি আপনার অভ্যন্তরীণ যোগদান থাকে তবে আপনার প্রয়োজনের তুলনায় আরও ডেটা প্রেরণের সম্ভাবনা 100%।

এটি রক্ষণাবেক্ষণের সমস্যাগুলির সৃষ্টি করে বিশেষত যখন আপনি নতুন কলাম যুক্ত করেছেন যা আপনি সর্বত্র দেখতে চান না। আপনার যদি নতুন কলাম থাকে তবে সেই কলামটি দিয়ে কী করবেন তা নির্ধারণ করার জন্য আপনাকে ইন্টারফেসে কিছু করার প্রয়োজন হতে পারে।

এটি ভিউগুলি ভেঙে ফেলতে পারে (আমি জানি এসকিউএল সার্ভারে এটি সত্য, এটি মাইএসকিএলে সত্য হতে পারে বা নাও)।

কেউ যদি আলাদাভাবে ক্রমে কলামগুলি দিয়ে টেবিলগুলি পুনর্নির্মাণের জন্য যথেষ্ট নির্বোধ হন (যা আপনার করা উচিত নয় তবে এটি সমস্ত সময় ঘটে থাকে), সমস্ত প্রকারের কোড ভাঙতে পারে। একটি সন্নিবেশের জন্য এস্পিসালি কোড উদাহরণস্বরূপ যেখানে হঠাৎ আপনি নির্দিষ্ট করে না দিয়েই এই শহরটিকে ঠিকানা_3 ক্ষেত্রের মধ্যে রাখছেন, ডাটাবেস কেবল কলামগুলির ক্রমেই যেতে পারে। যখন ডেটা ধরণের পরিবর্তন হয় তখন এটি যথেষ্ট খারাপ তবে অদলবদল কলামগুলিতে একই ডেটাটাইপ থাকায় আপনি কিছু সময় খারাপ ডেটা tingোকাতে পারেন যা পরিষ্কার করতে গোলমাল। আপনার ডেটা অখণ্ডতা সম্পর্কে যত্ন নেওয়া প্রয়োজন।

যদি এটি কোনও সন্নিবেশে ব্যবহৃত হয় তবে এটি একটি টেবিলের মধ্যে একটি নতুন কলাম যুক্ত করা থাকলে অন্যটি নয় তবে এটি সারণিটি ভেঙে দেবে।

এটি ট্রিগারগুলি ভেঙে যেতে পারে। ট্রিগার সমস্যাগুলি নির্ণয় করা কঠিন হতে পারে।

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

আমি আপনাকে এই বইটি পড়ার পরামর্শ দিচ্ছি: http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers-ebook/dp/B00A376BB2/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1389896688&sr=1- 1 & কীওয়ার্ড = SQL + + antipatterns

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