سؤال

خطأ SQL الصغير هذا هو Bugging لي. لا يبدو أنه مشكلة في الاستعلام، فقط النطاق (؟)، والأمثلة تعمل بشكل أفضل:

SELECT ocp.*, oc.*, GROUP_CONCAT( u.username SEPARATOR ', ') AS `memjoined`
FROM gangs_ocs_process ocp, gangs_ocs oc
LEFT JOIN users u ON u.userid IN ( ocp.membersin )
WHERE ocp.ocid =1 AND ocp.gangid =1 AND oc.oc_name = ocp.crimename
GROUP BY ocp.ocid
LIMIT 0 , 30 

هناك عمود (gangs_ocs_process.membersin) الذي يحتوي على قائمة بالمعرفات التي انضمت إليها (أي 1،2،5). أحاول الحصول على أسماء المستخدمين لكل من هذه المعرفات (من users الجدول) في واحد يذهب.

المشكلة هي LEFT JOIN users u ON u.userid IN ( ocp.membersin )

إذا لو خلصت 1,2,4 في ل ocp.membersin (وضع القائمة الحرفية بدلا من اسم العمود)، فإنه يعمل موافق. إرجاع عمود يحتوي على أسماء المستخدمين (صورة). ومع ذلك، إذا خرجت في OCP.MEMBERSIN، أحصل على هذا الخطأ:

#1054 - Unknown column 'ocp.membersin' in 'on clause'

هذه هي المرة الأولى التي استخدم فيها حتى في اليسار في الأعمال اليسرى، لذلك أنا ضائع بعض الشيء.

أي مساعدة ستكون رائعة :)

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

المحلول

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

نصائح أخرى

إذا كانت لديك سلاسل محددة في طاولتك، فستكون لديك مشكلة في التصميم في قاعدة البيانات الخاصة بك. أضف جدول جديد لعقد هذه القيم.

هل أنت متأكد من "الأعضاء" في جدول "gangs_ocs_process"، وليس الجدول "gangs_ocs"؟

السبب في أنه لا يمكنك الحصول عليه للعمل هو أولا تحتاج إلى حل قاعدة البيانات الخاصة بك. يجب ألا يكون لديك أبدا قائمة بالمعرف في عمود واحد.

بعد إلقاء نظرة أخرى، أعتقد أن مشكلتك تحاول التجمع عند نقطة خاطئة وكذلك في بناء جملة وأنك يجب أن تتراكم في عملية استقامة تقييدها محتويات الدخول. لا أعرف ما يكفي عن مخططك لجعل هذا الصندوق الصحيح، لكنك تريد شيئا مثل هذا. يجب أن تتعلق Somekeyfield مرة أخرى إلى gangs_ocs_process

SELECT ocp.*, oc.*, u.Memjoined
FROM gangs_ocs_process ocp, gangs_ocs oc
LEFT JOIN (Select SomeKeyField, GROUP_CONCAT( u.username SEPARATOR ', ') as memjoined
            from  users where userid in
            (select membersin from gangs_ocs_process 
             where [whatever conditions] )
             Group By SomeKeyField) u on ocp.SomeKeyField = u.SomeKeyField

WHERE ocp.ocid =1 AND ocp.gangid =1 AND oc.oc_name = ocp.crimename
GROUP BY ocp.ocid
LIMIT 0 , 30

هذا ال طريقة سيئة للحفاظ على العضوية.

ولكن إذا كنت لا تزال بحاجة إلى العيش معها، فقد تحاول REGEXP مطابقة لاختبار العضوية:

SELECT ocp.*, oc.*, GROUP_CONCAT( u.username SEPARATOR ', ') AS `memjoined`
FROM gangs_ocs_process ocp
LEFT JOIN users u ON (ocp.membersin RLIKE CONCAT('(^|,)[[:blank:]]?', userid, '[[:blank:]]?($|,)'))
JOIN gangs_ocs oc ON (ocp.ocid = 1 AND ocp.gangid = 1 AND oc.oc_name = ocp.crimename)
GROUP BY ocp.ocid
LIMIT 0 , 30
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top