الخلية الاستعلام: الحد من التسجيل
-
03-07-2019 - |
سؤال
ويقول لدي جدولين أريد أن أشارك. فئات:
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)