كيف يمكنني إضافة اثنين من العد (*) نتائج معا على اثنين من جداول مختلفة؟
سؤال
ولدي جدولين: لعب الاطفال والالعاب
+--------------------+------------------+
| Field | Type |
+--------------------+------------------+
| toy_id | int(10) unsigned |
| little_kid_id | int(10) unsigned |
+--------------------+------------------+
+--------------------+------------------+
| Field | Type |
+--------------------+------------------+
| game_id | int(10) unsigned |
| little_kid1 | int(10) unsigned |
| little_kid2 | int(10) unsigned |
| little_kid3 | int(10) unsigned |
+--------------------+------------------+
وهناك طفل صغير يمكن أن يكون اللعب متعددة. A طفل صغير يمكن أن يكون المشاركة في ألعاب متعددة في وقت واحد.
وأريد استعلام الذي سوف تعطيني عدد من الألعاب + ألعاب أن little_kid تشارك معها.
وأساسا، أريد أن مجموع هذه الاستعلامات اثنين:
SELECT COUNT(*) FROM Toys WHERE little_kid_id = 900; SELECT COUNT(*) from Games WHERE little_kid1 = 900 OR little_kid2 = 900 OR little_kid3 = 900;
هل من الممكن أن يحصل هذا في استعلام SQL واحد؟ من الواضح، ويمكنني أن ألخص لهم برمجيا، ولكن هذا أقل من المرغوب فيه.
(وأنا أدرك أن المثال مفتعلة يجعل ineffecient مخطط نظرة. لنفترض أننا لا نستطيع تغيير المخطط.)
المحلول
والتفاف عنها واستخدام الاستعلامات الفرعية:
SELECT
(SELECT COUNT(*) FROM Toys WHERE little_kid_id = 900)+
(SELECT COUNT(*) from Games WHERE little_kid1 = 900
OR little_kid2 = 900
OR little_kid3 = 900)
AS SumCount
وفويلا!
نصائح أخرى
SELECT COUNT(1) FROM
(
SELECT 1 FROM Toys WHERE little_kid_id = 900
UNION
SELECT 1 FROM Games WHERE little_kid1 = 900
OR little_kid2 = 900
OR little_kid3 = 900
)
SELECT
((SELECT COUNT(*) FROM Toys WHERE little_kid_id = 900)+
(SELECT COUNT(*) from Games WHERE little_kid1 = 900
OR little_kid2 = 900
OR little_kid3 = 900))
AS Sum FROM DUAL;
واعتمادا على كم من المرجح أن يتم تشغيل هذا الاستعلام وكيف غالبا ما يتغير البيانات التي يمكن دوريا وضع البيانات في الجدول مجمعة مثل هذا:
CREATE TABLE aggregated (
little_kid_id INT UNSIGNED,
games_count INT UNSIGNED,
toys_count INT UNSIGNED,
PRIMARY KEY (little_kid_id)
);
والأداء الحكمة التي من شأنها أن تكون الصورة ** ر الساخنة بسرعة وتتجنب أية استفسارات شبه سيئة.
وهذه محاولة واحدة ...
db: mysql
SELECT SUM(dum.tab) AS total FROM (
SELECT COUNT(b.category_id) AS tab FROM tblcategory AS b WHERE b.category_id=1
UNION ALL
SELECT COUNT(a.category_id) AS tab FROM tblcategory AS a WHERE a.category_id=2
) AS dum
SELECT M.*,M.TOYSCOUNT+M.GAMECOUNT
FROM (
(SELECT COUNT(*) FROM Toys WHERE little_kid_id) AS TOYSCOUNT,
(SELECT COUNT(*) from Games WHERE little_kid1 = 900 OR little_kid2 = 900 OR little_kid3 = 900) AS GAMECOUNT
) M
select t1.tx,t2.px,t3.mx,t2.px + t3.mx
as total from(
SELECT COUNT (DISTINCT id) as tx
FROM Customer) as t1
cross join(
select COUNT (DISTINCT name) as px
FROM details
) as t2
cross join(
select count (distinct device_id) as mx
from detailconfig
) as t3