বাম যোগদান করুন শুধুমাত্র প্রথম সারিতে


137

আমি প্রথম বামে প্রথম সারিতে যোগ দেওয়ার বিষয়ে অনেক থ্রেড পড়েছি, তবে কোনও কারণে, এটি আমার পক্ষে কার্যকর হয় না।

এখানে আমার কাঠামো (অবশ্যই সরলীকৃত)

ফিডসের

id |  title | content
----------------------
1  | Feed 1 | ...

শিল্পী

artist_id | artist_name
-----------------------
1         | Artist 1
2         | Artist 2

feeds_artists

rel_id | artist_id | feed_id
----------------------------
1      |     1     |    1 
2      |     2     |    1 
...

এখন আমি নিবন্ধগুলি পেতে এবং কেবল প্রথম শিল্পীর সাথে যোগ দিতে চাই এবং আমি এরকম কিছু ভেবেছিলাম:

SELECT *
    FROM feeds 
    LEFT JOIN feeds_artists ON wp_feeds.id = (
        SELECT feeds_artists.feed_id FROM feeds_artists
        WHERE feeds_artists.feed_id = feeds.id 
    LIMIT 1
    )
WHERE feeds.id = '13815'

কেবলমাত্র ফিড_আরটিস্টদের প্রথম সারিটি পেতে, তবে ইতিমধ্যে এটি কাজ করে না।

আমি TOPআমার ডাটাবেসের কারণে ব্যবহার করতে পারি না এবং feeds_artists.artist_idতারিখ অনুসারে বাছাই করা প্রয়োজন হিসাবে ফলাফলগুলি গোছাতে পারি না (এইভাবে তাদের গোষ্ঠীভুক্ত করার ফলে আমি ফলাফল পেয়েছি, তবে ফলাফল যেখানে নতুন নয়)

পাশাপাশি আউটর অ্যাপ্লিকেশন দিয়েও কিছু চেষ্টা করে দেখুন - তেমন সাফল্যও পায় না। সত্যি কথা বলতে কী আমি এই সারিগুলিতে কী ঘটছে তা সত্যিই কল্পনা করতে পারি না - সম্ভবত সবচেয়ে বড় কারণ আমি এই কাজটি করতে পারি না।

সমাধান:

SELECT *
FROM feeds f
LEFT JOIN artists a ON a.artist_id = (
    SELECT artist_id
    FROM feeds_artists fa 
    WHERE fa.feed_id = f.id
    LIMIT 1
)
WHERE f.id = '13815'


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

আপনার সমাধানটি একটি উত্তর হিসাবে রাখা উচিত যাতে আমরা এটিতে ভোট দিতে পারি এবং এটি ভবিষ্যতের দর্শকদের জন্য আরও দৃশ্যমান হতে পারে
fguillen

আমার ধারণা আপনি ঠিক আছেন - আমি এটি উত্তর হিসাবে যুক্ত করেছি।
কেডিডিসি

উত্তর:


97

যদি আপনি সময়ের সাথে শিল্পী আইডিগুলির বর্ধিততা ধরে নিতে পারেন তবে তা MIN(artist_id)হবে প্রথম দিকের।

সুতরাং এটির মতো কিছু চেষ্টা করুন (অরক্ষিত ...)

SELECT *
  FROM feeds f
  LEFT JOIN artists a ON a.artist_id = (
    SELECT
      MIN(fa.artist_id) a_id
    FROM feeds_artists fa 
    WHERE fa.feed_id = f.feed_id
  ) a

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

@ কেডিডিসি উত্তর যুক্ত করার জন্য প্রশ্ন পরিবর্তন করার পরিবর্তে, এই উত্তরটি সম্পাদনা করুন বা আপনার নিজের উত্তর তৈরি করুন।
ফোনিক্স

4
এই মুহুর্তে একটি সহজ সাব-কোয়েরি ভাল না? কারণ এখন আপনার একটি যোগদান এবং একটি উপ-প্রশ্ন রয়েছে। কেবল কারণ জিজ্ঞাসা করছি আমি একই সমস্যার সমাধান খুঁজছি :)
গ্যাল্ডিকাস

2
subquery খুব ধীর।
সিনাক্স

1
@ সিনাক্স "খুব ধীর" সংজ্ঞায়িত করেছেন। এটি রেকর্ডের সংখ্যা এবং প্রদত্ত প্রয়োজনীয়তার উপর নির্ভর করে।
পর্যবেক্ষক

53

সাবলেট না করে সংস্করণ:

   SELECT f.title,
          f.content,
          MIN(a.artist_name) artist_name
     FROM feeds f
LEFT JOIN feeds_artists fa ON fa.feed_id = f.id
LEFT JOIN artists a ON fa.artist_id = a.artist_id
 GROUP BY f.id

2
আমি মনে করি না এটি প্রথম সারি (প্রথম আইডি বা অন্য কোনও কিছুর প্রথম) হবে, এটি এলোমেলোভাবে বাম জোড়ের সারিগুলির মধ্যে একটি বেছে নিন।
সিনুক্স

26
এই প্রশ্নটি ভুল। এটি "সর্বনিম্ন" শিল্পীর নাম নির্বাচন করবে প্রথম সেট শিল্পীদের নাম নয়।
গ্লাপা

5
প্রশ্নের জন্য ভুল ... তবে আমি ঠিক কী চাই। আমার ক্ষেত্রে, আমি যে টেবিলটিতে যোগ দিচ্ছি তার মধ্যে কেবল প্রথম আইডি চাই
ড্র্রু স্টিফেন্স

2
এখানে সমস্যাটি হ'ল আপনি যদি কোনও COUNT বা SUM করার সিদ্ধান্ত নেন তবে আপনার ডেটা স্ক্রু আপ হবে। সাবলেক্টের সমস্যাটি হ'ল এটি একটি অস্থায়ী টেবিল তৈরি করার সাথে সাথে ডেটা পাওয়ার পক্ষে ভারী ...
শাদোয়েব

এই সমাধানে পারফরম্যান্স সমস্যা রয়েছে। পরিবর্তে ন্যূনতম / সর্বোচ্চ সমাধান ব্যবহার করুন।
সাদেঘে প্রধানমন্ত্রী

25

@ ম্যাট ডজস উত্তর আমাকে সঠিক পথে রাখে। সমস্ত উত্তরগুলির জন্য আবার ধন্যবাদ, যা মধ্য সময়ে প্রচুর লোককে সহায়তা করেছিল। এটিকে এভাবে কাজ করতে পেলাম:

SELECT *
FROM feeds f
LEFT JOIN artists a ON a.artist_id = (
    SELECT artist_id
    FROM feeds_artists fa 
    WHERE fa.feed_id = f.id
    LIMIT 1
)
WHERE f.id = '13815'

এটি উত্তরটি কেবল প্রথম সারির জন্য কাজ করছে। f.idশর্ত না থাকলে ভেঙে যায় ।
তাজনি

2

আমি অন্য কিছু ব্যবহার করেছি (আমি আরও ভাল মনে করি ...) এবং এটি ভাগ করতে চাই:

আমি একটি ভিউ তৈরি করেছি যার "গ্রুপ" ধারা রয়েছে cla

CREATE VIEW vCountries AS SELECT * PROVINCES GROUP BY country_code

SELECT * FROM client INNER JOIN vCountries on client_province = province_id

আমি এখনও বলতে চাই, আমি মনে করি যে সমাধানটি আমাদের কিছু করা উচিত ছিলনা কারণ বিশ্লেষণে কিছু ভুল ছিল ... কমপক্ষে আমার ক্ষেত্রে ... তবে কখনও কখনও এটি করা সস্তা যে সবকিছু পুনরায় ডিজাইন করার জন্য ...

আমি আসা করি এটা সাহায্য করবে!


ধরে নিই country_codeযে প্রত্যেকের জন্য একাধিক সারি (প্রদেশ?) রয়েছে , GROUP BYতা অনুচিত। দেখুন ONLY_FULL_GROUP_BY
রিক জেমস

বাম / অভ্যন্তরীণ যোগদানের জন্য সম্পূর্ণভাবে ব্যবহার করার জন্য আপনাকে কোনও ভিউ তৈরি করতে হবে না?! একটি subquery বা একটি WITH x AS (ধারা ব্যবহার করতে পারেন ?
কিরাদোটি

2

এখানে বেশ কয়েকটি উত্তরের উপর ভিত্তি করে আমি এমন কিছু পেয়েছি যা আমার পক্ষে কাজ করেছে এবং আমি কী ঘটছে তা সাধারণীকরণ এবং ব্যাখ্যা করতে চেয়েছিলাম।

রূপান্তর:

LEFT JOIN table2 t2 ON (t2.thing = t1.thing)

প্রতি:

LEFT JOIN table2 t2 ON (t2.p_key = (SELECT MIN(t2_.p_key) 
    FROM table2 t2_ WHERE (t2_.thing = t1.thing) LIMIT 1))

যে অবস্থা টি 1 এবং টি 2 কে সংযুক্ত করে সেটিকে অভ্যন্তরীণ কোয়েরিতে স্থানান্তরিত ONকরা হয় WHEREMIN(primary key)অথবা LIMIT 1তোলে শুধুমাত্র 1 টি সারি ভেতরের ক্যোয়ারী দ্বারা ফিরিয়ে দেওয়া হয় নিশ্চিত করুন যে।

একটি নির্দিষ্ট সারি বাছাই করার পরে আমাদের ONএটি বলতে হবে যে এটি কোন সারিটি। এজন্য ONযুক্ত টেবিডের প্রাথমিক কীটি তুলনা করছে।

আপনি অভ্যন্তরীণ ক্যোয়ারী (অর্থাত্ অর্ডার + সীমা) দিয়ে খেলতে পারেন তবে এটি অবশ্যই পছন্দসই সারির একটি প্রাথমিক কীটি ফিরিয়ে আনবে ONযা সঠিক সারিতে যোগদানের জন্য বলবে ।


দ্রষ্টব্য: এটি কেবল LIMITবা শুধুমাত্র সাথে কাজ করবে MINONশর্ত এড়ানোর কর্মক্ষমতা প্রভাব যোগদান টেবিল প্রাথমিক কী হওয়া আবশ্যক।
অরিয়াদাম

1

আমি আরও সাধারণতর উত্তর দিতে চাই । আপনি যখন কোনও বাম যোগদানের মধ্যে প্রথম আইটেমটি নির্বাচন করতে চান তখন এমন কোনওটি যেকোনো ক্ষেত্রে পরিচালনা করবে ।

আপনি এমন একটি সাবকিউরি ব্যবহার করতে পারেন যা আপনি যা চান তা GROUP_CONCATS (বাছাইও করা হয়েছে!), তারপরে কেবল GROUP_CONCAT'd ফলাফলটি বিভক্ত করুন এবং কেবল তার প্রথম আইটেমটি নিন, যেমন ...

LEFT JOIN Person ON Person.id = (
    SELECT SUBSTRING_INDEX(
        GROUP_CONCAT(FirstName ORDER BY FirstName DESC SEPARATOR "_" ), '_', 1)
    ) FROM Person
);

যেহেতু আমরা আছে DESC আমাদের যেমন করে অর্ডার বিকল্প এই "জ্যাক" মত কেউ জন্য একটি ব্যক্তি আইডি ফিরে আসবে। আমরা যদি "অ্যান্ডি" মত নাম দিয়ে কেউ চেয়েছিলেন, আমরা পরিবর্তন হবে আদেশে FirstName DESC করার আদেশ দ্বারা FirstName উচ্চক্রমে

এটি নম্র, কারণ এটি আপনার হাতে পুরোপুরি অর্ডার দেওয়ার ক্ষমতা রাখে। তবে, অনেক পরীক্ষার পরেও, এটি প্রচুর ব্যবহারকারী এবং প্রচুর ডেটা সহ কোনও পরিস্থিতিতে ভাল স্কেল করতে পারে না

এটি অ্যাডমিনের জন্য ডেটা-নিবিড় প্রতিবেদন চালাতে কার্যকর।


GROUP_CONCATযতদিন মান রয়েছে তা গণনা সীমাবদ্ধ কৌতুক ভাল। ডিফল্ট সীমা 1024 অক্ষর।
রিক জেমস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.