كيف يمكنني إضافة اثنين من العد (*) نتائج معا على اثنين من جداول مختلفة؟

StackOverflow https://stackoverflow.com/questions/826365

  •  05-07-2019
  •  | 
  •  

سؤال

ولدي جدولين: لعب الاطفال والالعاب

+--------------------+------------------+
| 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;

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