كيف يمكنني الحصول على عدد الصفوف المرتبطة في الصلة اليسرى في MySQL؟

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

سؤال

لدي جدولين، أ vehicle الجدول مع الأعمدة:

  • id
  • stock
  • year
  • make
  • model

و images الجدول مع الأعمدة:

  • id
  • vehicle_id
  • name
  • caption
  • default tinyint(1)

أحاول إدراج معلومات السيارة وصورتها الافتراضية والعدد الإجمالي للصور الموجودة في السيارة.حاليا أنا أستخدم ما يلي SELECT إفادة:

SELECT vehicle.id, vehicle.stock, vehicle.year,
    vehicle.make, vehicle.model, images.name,
    COUNT(images.id)
FROM vehicle
LEFT JOIN images
ON vehicle.id = images.vehicle_id

في البداية كنت أستخدم:

ON vehicle.id = images.vehicle_id AND images.default = 1

ولكن بعد ذلك سيكون عدد الصور 1 أو 0 فقط اعتمادًا على ما إذا كانت هناك صورة افتراضية في قاعدة البيانات.لقد حاولت استخدام UNION وغيرها SELECT البيانات ولكن ما زلت غير قادر على الحصول على نتيجة مناسبة.هل أحتاج إلى استخدام اثنين SELECT البيانات أم أن هناك طريقة أخرى للتعامل معها JOIN أو UNION?

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

المحلول

SELECT 
    `vehicle`.`id`, 
    `vehicle`.`stock`, 
    `vehicle`.`year`, 
    `vehicle`.`make`, 
    `vehicle`.`model`, 
    `images`.`name`,
    (
        SELECT COUNT(*) 
        FROM `images` 
        WHERE `vehicle_id` = `vehicle`.`id`
    ) AS `image_count`
FROM `vehicle`
LEFT JOIN `images`
ON `images`.`vehicle_id` = `vehicle`.`id`
WHERE `images`.`default`

نصائح أخرى

بالطريقة التي يقترحها الجواب، تحصل على قيم متكررة لكلمة "مركبة".الطريقة الأفضل هي تجميع النتائج.حاول بدون JOIN :

SELECT 
    `vehicle`.`id`, 
    `vehicle`.`stock`, 
    `vehicle`.`year`, 
    `vehicle`.`make`, 
    `vehicle`.`model`, 
    `images`.`name`,
    (
        SELECT COUNT(*) 
        FROM `images` 
        WHERE `vehicle_id` = `vehicle`.`id`
    ) AS `image_count`
FROM `vehicle`

WHERE `images`.`default`

اسمحوا لي أن أوضح الأمر للجميع!

مهمة:طباعة جدول 3 أعمدة:

  1. المركبات (العناوين) من مركبات طاولة.
  2. كمية التعليقات لكل مركبة من تعليقات طاولة.
  3. كمية الصور لكل مركبة من الصور طاولة.

الناتج المتوقع (مجرد مثال):

+----------------------+----------------+--------------+
|        title         | comments_count | images_count |
+----------------------+----------------+--------------+
| BMW X6               |             35 |            9 |
| Audi A6              |              3 |            5 |
| Volkswagen Passat B6 |             78 |            6 |
| Volkswagen Passat B5 |            129 |            4 |
+----------------------+----------------+--------------+

حل:

SELECT 
    vehicles.title,
    (SELECT COUNT(*) FROM comments WHERE vehicles.id = comments.vehicle_id) AS comments_count,
    (SELECT COUNT(*) FROM images WHERE vehicles.id = images.vehicle_id) AS images_count
FROM vehicles
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top