كيف يمكنني الحصول على عدد الصفوف المرتبطة في الصلة اليسرى في MySQL؟
سؤال
لدي جدولين، أ 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 أعمدة:
- المركبات (العناوين) من مركبات طاولة.
- كمية التعليقات لكل مركبة من تعليقات طاولة.
- كمية الصور لكل مركبة من الصور طاولة.
الناتج المتوقع (مجرد مثال):
+----------------------+----------------+--------------+
| 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
لا تنتمي إلى StackOverflow