سؤال

لدي استعلام MySQL وأريد تضمين قائمة بالمعرفات من جدول آخر.على موقع الويب، يستطيع الأشخاص إضافة عناصر معينة، ويمكنهم بعد ذلك إضافة تلك العناصر إلى مفضلاتهم.أريد أساسًا الحصول على قائمة معرفات الأشخاص الذين فضلوا هذا العنصر (هذا مبسط بعض الشيء، ولكن هذا هو ما يتلخص في الأمر).

في الأساس، أفعل شيئًا مثل هذا:

SELECT *,
GROUP_CONCAT((SELECT userid FROM favourites WHERE itemid = items.id) SEPARATOR ',') AS idlist
FROM items
WHERE id = $someid

بهذه الطريقة، سأكون قادرًا على إظهار من فضل بعض العناصر، عن طريق تقسيم قائمة idlist لاحقًا إلى مصفوفة في PHP لاحقًا في الكود الخاص بي، ومع ذلك أتلقى خطأ MySQL التالي:

1242 - يقوم الاستعلام الفرعي بإرجاع أكثر من صف واحد

اعتقدت أن هذا كان نوعًا من نقطة الاستخدام GROUP_CONCAT بدلاً من، على سبيل المثال، CONCAT؟هل أتعامل مع هذا بطريقة خاطئة؟


حسنًا، شكرًا على الإجابات حتى الآن، ويبدو أن هذا ناجح.ومع ذلك، هناك كمية الصيد.تعتبر العناصر أيضًا مفضلة إذا تمت إضافتها بواسطة هذا المستخدم.لذلك سأحتاج إلى فحص إضافي للتحقق مما إذا كان منشئ المحتوى = معرف المستخدم.هل يمكن لأي شخص أن يساعدني في التوصل إلى طريقة ذكية (ونأمل أن تكون فعالة) للقيام بذلك؟

شكرًا لك!

يحرر:لقد حاولت فقط أن أفعل هذا:

SELECT [...] LEFT JOIN favourites ON (userid = itemid OR creator = userid)

و idlist فارغ.لاحظ أنه إذا كنت تستخدم INNER JOIN بدلاً من LEFT JOIN أحصل على نتيجة فارغة.على الرغم من أنني متأكد من وجود صفوف تلبي متطلبات ON.

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

المحلول

لا يمكنك الوصول إلى المتغيرات في النطاق الخارجي في مثل هذه الاستعلامات (لا يمكن استخدامها items.id هناك).يجب عليك بدلاً من ذلك تجربة شيء من هذا القبيل

SELECT
    items.name,
    items.color,
    CONCAT(favourites.userid) as idlist
FROM
    items
INNER JOIN favourites ON items.id = favourites.itemid
WHERE
    items.id = $someid
GROUP BY
    items.name,
    items.color;

قم بتوسيع قائمة الحقول حسب الحاجة (الاسم، اللون...).

نصائح أخرى

لقد فهم OP الأمر بشكل صحيح تقريبًا. GROUP_CONCAT يجب أن يتم التفاف الأعمدة في الاستعلام الفرعي وليس استعلام فرعي كامل (أنا أستبعد الفاصل لأن الفاصلة هي الافتراضية):

SELECT i.*,
(SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist
FROM items i
WHERE i.id = $someid

سيؤدي هذا إلى النتيجة المطلوبة ويعني أيضًا أن الإجابة المقبولة خاطئة جزئيًا، لأنه يمكنك الوصول إلى متغيرات النطاق الخارجي في استعلام فرعي.

أعتقد أنه قد يكون لديك خطأ "userid = itemid"، ألا يجب أن يكون الأمر على هذا النحو:

SELECT ITEMS.id,GROUP_CONCAT(FAVOURITES.UserId) AS IdList
FROM FAVOURITES 
INNER JOIN ITEMS ON (ITEMS.Id = FAVOURITES.ItemId OR FAVOURITES.UserId = ITEMS.Creator)
WHERE ITEMS.Id = $someid
GROUP BY ITEMS.ID

الغرض من GROUP_CONCAT صحيح ولكن الاستعلام الفرعي غير ضروري ويسبب المشكلة.جرب هذا بدلاً من ذلك:

SELECT ITEMS.id,GROUP_CONCAT(FAVOURITES.UserId)
FROM FAVOURITES INNER JOIN ITEMS ON ITEMS.Id = FAVOURITES.ItemId
WHERE ITEMS.Id = $someid
GROUP BY ITEMS.ID

نعم، حل Soulmerge جيد.لكنني كنت بحاجة إلى استعلام حيث كان علي جمع البيانات من المزيد من الجداول الفرعية، على سبيل المثال:

  • الجدول الرئيسي: جلسات (جلسات العرض) (uid، name، ..)
  • الجدول الفرعي الأول: الأحداث مع معرف الجلسة الرئيسي (uid، session_uid، التاريخ، time_start، time_end)
  • الجدول الفرعي الثاني: الملحقات_المطلوبة (الكمبيوتر المحمول، وجهاز العرض، والميكروفونات، وما إلى ذلك) مع معرف جلسة العمل الرئيسي (uid، وsession_uid، واسم الملحق)
  • الجدول الفرعي الثالث: session_presenters (الأشخاص المقدمون) مع معرف الجلسة الرئيسي (uid، session_uid، اسم_المقدم، العنوان...)

تحتوي كل جلسة على المزيد من الصفوف في جداول الجداول الفرعية (جداول زمنية أكثر، المزيد من الملحقات)

وكنت بحاجة إلى جمع مجموعة واحدة لكل جلسة لعرضها في صف الخام (بعضها):

session_id | session_name | date | time_start | time_end | accessories | presenters

الحل الخاص بي (بعد ساعات عديدة من التجارب):

SELECT sessions.uid, sessions.name,
    ,(SELECT GROUP_CONCAT( `events`.date SEPARATOR '</li><li>') 
            FROM `events` 
            WHERE `events`.session_id = sessions.uid ORDER BY `events`.date) AS date
    ,(SELECT GROUP_CONCAT( `events`.time_start SEPARATOR '</li><li>') 
            FROM `events` 
            WHERE `events`.session_id = sessions.uid ORDER BY `events`.date) AS time_start
    ,(SELECT GROUP_CONCAT( `events`.time_end SEPARATOR '</li><li>') 
            FROM `events` 
            WHERE `events`.session_id = sessions.uid ORDER BY `events`.date) AS time_end
    ,(SELECT GROUP_CONCAT( accessories.name SEPARATOR '</li><li>') 
            FROM accessories 
            WHERE accessories.session_id = sessions.uid ORDER BY accessories.name) AS accessories
    ,(SELECT GROUP_CONCAT( presenters.name SEPARATOR '</li><li>') 
            FROM presenters
            WHERE presenters.session_id = sessions.uid ORDER BY presenters.name) AS presenters

    FROM sessions

لذلك لا حاجة إلى الانضمام أو المجموعة.شيء آخر مفيد لعرض البيانات بشكل ملائم (عند "ترديدها"):

  • يمكنك تغليف events.date، وtime_start، وtime_end، وما إلى ذلك في "<UL><LI> ...</LI></UL>" لذا فإن "<LI></LI>" المستخدم كفاصل في الاستعلام سوف يفصل النتائج في عناصر القائمة.

آمل أن يساعد هذا شخص ما.هتافات!

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