سؤال

لست متأكدًا تمامًا مما إذا كان هذا هو النهج الصحيح، فهذا هو وضعي:

أحاول حاليًا تحديد 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 ..

يحرر:سجل نشط مع CodeIgniter

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

المحلول

يمكنك جلب صورة عشوائية في استعلام فرعي:

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 عليه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top