2008-10-02 26 views
5

कहें कि मेरे पास दो टेबल हैं जो मैं शामिल होना चाहता हूं। वर्ग:MySQL क्वेरी: एक जॉइनिंग

id name 
---------- 
1 Cars 
2 Games 
3 Pencils 

और आइटम:

id categoryid itemname 
--------------------------- 
1 1   Ford 
2 1   BMW 
3 1   VW 
4 2   Tetris 
5 2   Pong 
6 3   Foobar Pencil Factory 

मैं एक प्रश्न है कि वर्ग और पहली (और केवल पहले) रिटर्न चाहते ITEMNAME:

category.id category.name item.id item.itemname 
------------------------------------------------- 
1   Cars   1  Ford 
2   Games   4  Tetris 
3   Pencils  6  Foobar Pencil Factory 

और वहाँ एक है जिस तरह से मुझे यादृच्छिक परिणाम मिल सकते हैं जैसे:

category.id category.name item.id item.itemname 
------------------------------------------------- 
1   Cars   3  VW 
2   Games   5  Pong 
3   Pencils  6  Foobar Pencil Factory 

धन्यवाद!

+0

आप "पहले" को कैसे परिभाषित करते हैं? यह आइटम में सबसे कम आईडी मान की तरह दिखता है? –

+0

हाँ, मेरा बुरा। सबसे पहले मेरा मतलब सबसे कम आईडी है। – Eikern

उत्तर

6

बस एक त्वरित किया परीक्षा। ऐसा लगता है:

mysql> select * from categories c, items i 
    -> where i.categoryid = c.id 
    -> group by c.id; 
+------+---------+------+------------+----------------+ 
| id | name | id | categoryid | name   | 
+------+---------+------+------------+----------------+ 
| 1 | Cars | 1 |   1 | Ford   | 
| 2 | Games | 4 |   2 | Tetris   | 
| 3 | Pencils | 6 |   3 | Pencil Factory | 
+------+---------+------+------------+----------------+ 
3 rows in set (0.00 sec) 

मुझे लगता है कि यह आपका पहला प्रश्न पूरा करेगा। दूसरे के बारे में निश्चित नहीं है - मुझे लगता है कि यादृच्छिक() या उस तरह से कुछ के साथ एक आंतरिक क्वेरी की आवश्यकता है!

+0

परिणाम यादृच्छिक होने के कारण मेरे लिए यह महत्वपूर्ण नहीं है, इसलिए यह वही था जो मैं ढूंढ रहा था! धन्यवाद – Eikern

0

Mysql समूह या कुल में शामिल नहीं कॉलम के लिए आप की सुविधा देता है, जो मामले में वे यादृच्छिक मान मिल गया है:

select category.id, category.name, itemid, itemname 
    inner join 
     (select item.categoryid, item.id as itemid, item.name as itemname 
     from item group by categoryid) 
    on category.id = categoryid 

या, न्यूनतम के लिए,

select category.id, category.name, itemid, itemname 
inner join 
    (select item.categoryid, min(item.id) as itemid, item.name as itemname 
    from items 
    group by item.categoryid) 
on category.id = categoryid 
+0

जब मैंने इस विधि को आजमाया तो मुझे एक त्रुटि मिली: "प्रत्येक व्युत्पन्न तालिका में अपना स्वयं का उपनाम होना चाहिए"। मुझे लगता है कि मैंने कहीं कुछ गलत किया है। – Eikern

0

माइस्क्ल में गैर समेकित कॉलम शामिल होने दें और निर्धारणा की कोई गारंटी नहीं है, लेकिन मेरे अनुभव में मुझे लगभग हमेशा पहले मान मिलते हैं।

तो आम तौर पर (लेकिन इसकी गारंटी नहीं) आप गारंटी आप की तरह

select categories.id, categories.name, items.id, items.name 
from categories inner join 
    items on items.categoryid = categories.id and 
    items.id = (select min(items2.id) from items as items2 where items2.categoryid = category.id) 

कुछ करने के लिए आप यादृच्छिक जवाब आप होगा चाहते हैं की आवश्यकता होगी चाहते हैं, तो यह आपके पहले

select * 
from categories c, items i 
where i.categoryid = c.id 
group by c.id; 

दे देंगे subquery को थोड़ा सा बदलने के लिए

select categories.id, categories.name, items.id, items.name 
    from categories inner join 
     items on items.categoryid = categories.id and 
     items.id = (select items2.id from items as items2 where items2.categoryid = category.id order by rand() limit 1) 
संबंधित मुद्दे