سؤال

ويقول لدي جدولين أريد أن أشارك. فئات:

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

وشكرا!

هل كانت مفيدة؟

المحلول

وفقط فعلت اختبار سريع. يبدو أن هذا العمل:

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)

وأعتقد أن هذا من شأنه تحقيق سؤالك الأول. غير متأكدة من ثانية واحدة - أعتقد أن يحتاج استعلام الداخلي مع النظام من قبل عشوائي () أو شيء من هذا القبيل

نصائح أخرى

وماي يتيح لك الحصول على الأعمدة غير المدرجة في تجمع أو الكلي، وفي هذه الحالة لديهم القيم العشوائية:

    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

والخلية لا تدع تشمل الأعمدة غير المجمعة، وليس هناك ما يضمن الحتمية، ولكن في تجربتي أنا دائما تقريبا الحصول على قيم الأولى.

وهكذا عادة (ولكن ليست مضمونة) وهذا سوف تعطيك أول

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

إذا كنت تريد يضمن لك سوف تحتاج إلى القيام شيء من هذا القبيل

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 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top