MySQL - الاستعلامات الفرعية والانضمامات
سؤال
لست متأكدًا تمامًا مما إذا كان هذا هو النهج الصحيح، فهذا هو وضعي:
أحاول حاليًا تحديد 15 معرضًا ثم الانضمام إليه مع جدول المستخدم من خلال المعرف ولكني أريد أيضًا تحديد صورة عشوائية واحدة من كل معرض ولكن مما أعرفه أنه لا يمكنك تقييد الارتباط الأيسر (الصورة) بـ التقط صورة عشوائية واحدة فقط دون إجراء استعلام فرعي.
إليك ما حصلت عليه حتى الآن ولكنه لا يعمل كما ينبغي:
SELECT galleries.id, galleries.name, users.username, pictures.url
FROM galleries
LEFT JOIN users ON users.id = galleries.user_id
LEFT JOIN pictures ON (
SELECT pictures.url
FROM pictures
WHERE pictures.gallery_id = galleries.id
ORDER BY RAND()
LIMIT 1)
WHERE active = 1
ORDER BY RAND()
LIMIT 15
لقد حاولت أيضًا القيام بذلك باستخدام سجل نشط لكنني تعثرت بعد إجراء عمليتين على اليسار، هل من الممكن الحصول على استعلام فرعي هنا:
$this->db->select('galleries.id, galleries.name, users.id as user_id, users.username');
$this->db->from('galleries');
$this->db->join('users', 'users.id = galleries.user_id','left');
$this->db->join('pictures','pictures.gallery_id = galleries.id AND','left');
$this->db->where('active',1);
آمل ألا يكون الأمر فوضويًا ولكني بدأت أشعر بالارتباك من خلال جميع استعلامات SQL ..
المحلول
يمكنك جلب صورة عشوائية في استعلام فرعي:
select
g.name, u.username,
(select url from pictures p where p.gallery_id = g.gallery_id
order by rand() limit 1) as url
from galleries g
left join users u on g.user_id = u.id
where g.active = 1
بناءً على تعليقك، يمكنك تحديد صورة لكل معرض في استعلام فرعي.هذا على افتراض أن جدول الصورة يحتوي على عمود معرف.
select
g.name, u.username, p.url, p.name
from (
select id, user_id, name,
(select id from pictures p
where p.gallery_id = g.gallery_id
order by rand() limit 1) as samplepictureid
from galleries
where g.active = 1
) g
left join users u on g.user_id = u.id
left join pictures p on p.id = g.samplepictureid
نصائح أخرى
SELECT
g.id,
g.name,
u.username,
p.url
FROM
galleries g
INNER JOIN (SELECT DISTINCT
gallery_id,
(SELECT url FROM pictures ss WHERE ss.gallery_id = s.gallery_id
ORDER BY RAND() LIMIT 1) AS url
FROM
pictures s) p ON
g.id = p.gallery_id
LEFT OUTER JOIN users u ON
g.user_id = u.id
WHERE
g.active = 1
سيخرج هذا الاستعلام ويحدد معرضًا، ثم سيبحث عن أي معرض به صورة (إذا كنت تريد إرجاع المعارض بدون صورة، فقم بتغيير INNER JOIN إلى LEFT OUTER JOIN، وستكون بخير).بعد ذلك، فإنه ينضم إليه مع المستخدمين.الآن، بالطبع، سيعيد هذا الجرو كل معرض غريب مهما كان عدد المستخدمين لديك (يا إلهي!).قد ترغب في تقييد المستخدم في جملة WHERE (على سبيل المثال-WHERE u.id = 123
).وإلا فإنك سوف تحصل على نتائج أكثر مما كنت تتوقع.هذا، أو قم بإجراء INNER JOIN عليه.