0

1 つに結合したい 2 つの select ステートメントがありますが、実際には 2 番目の select ステートメント ( datauser_info_data のフィールド) の 1 つのフィールドからの情報のみが必要です。必要なフィールドは、Firstname、lastname、email、コースのフルネーム、役割、およびdatafieldid = '15' のフィールドです。最初の select ステートメントは、データ フィールド以外のすべてを提供します。そして2番目はコース以外のすべてを教えてくれます。Role フィールドに似た 2 番目の select ステートメントを実行しようとしましたが、複数の行が返されると不平を言います。fieldid='15' 部分なしでコース名を使用しようとすると、100k を超えるレコードが表示されます (各ユーザーは各コースとそのすべてのデータに表示されます)。

テーブルのフィールド:

user(id,auth,confirmed,policyagreed,username,password,idnumber,firstname,lastname,email,phone etc..)
user_info_data(id,userid,fieldid,data)
role(id,name,shortname,description,sortorder)
role_assignments(id,roleid,contextid,userid...)
context(id,contextlevel,instanceid,path,depth)

最初のステートメント:

SELECT user.firstname AS Firstname, user.lastname AS Lastname, user.email AS Email, course.fullname AS Course, role.name AS Role
FROM user AS user, course AS course,role,role_assignments AS asg
INNER JOIN context AS context ON asg.contextid=context.id   
WHERE context.contextlevel = 50
AND role.id=asg.roleid
AND user.id=asg.userid
AND context.instanceid=course.id

最初のステートメントの出力:

ファーストネーム ラストネーム メール コースの役割

John Doe john.doe@email.com コース名 学生

2 番目のステートメント:

SELECT user.firstname AS 'First Name', user.lastname AS 'Last Name', user.email AS 'Email', user_info_data.data AS 'IBCLC Certified'
FROM user, user_info_data
WHERE user.id = user_info_data.userid
AND fieldid = '15'

2 番目のステートメントの出力:

ファーストネーム ラストネーム Eメール IBCLC認定

John Doe john.doe@email.com はい

望ましい出力:

名、姓、電子メール、IBCLC認定、コース、役割

私が試したその他の select ステートメント: 9,494 レコードを表示しますが、現在、fieldid が 15 であるフィールド データは可能な選択肢のリストです。それはなぜでしょうか?

SELECT user.firstname AS Firstname, user.lastname AS Lastname, user.email AS Email, userdata.data, course.fullname AS Course, role.name AS Role
FROM user AS user, course AS course, user_info_data AS userdata, role,role_assignments AS asg
INNER JOIN context AS context ON asg.contextid=context.id   
WHERE context.contextlevel = 50
AND userdata.fieldid = 15
AND role.id=asg.roleid
AND user.id=asg.userid
AND context.instanceid=course.id
4

1 に答える 1

1

user_info_data私はあなたの最初のリクエストに次のように追加しました:

SELECT user.firstname AS Firstname,
       user.lastname AS Lastname,
       user.email AS Email,
       course.fullname AS Course,
       role.name AS Role,
       ibclcCert.data AS 'IBCLC Certified'
FROM user,
     course,
     role,
     role_assignments AS asg,
     context,
     user_info_data AS ibclcCert
WHERE context.contextlevel = 50
  AND role.id=asg.roleid
  AND user.id=asg.userid
  AND context.instanceid=course.id
  AND asg.contextid=context.id
  AND ibclcCert.userid = user.id
  AND ibclcCert.fieldid = '15'

user_info_dataこの場合、実際のフィールドを示す名前にテーブル参照の名前を変更しましたibclcCert。この名前変更は、ある日、複数のデータフィールドにアクセスしたい場合の規定です。その場合、必要なフィールドごとに1つずつ、テーブルを複数回含めます。このようなデータ形式の処理方法については、この回答も参照してください。

于 2012-07-18T15:08:53.147 に答える