1

私の画像ラベル付けアプリでは、画像に割り当てられたラベルのリストを、このラベルを割り当てたラベルタイプとユーザー情報とともに表示したいと考えています。メイン テーブルは imageLabel です。テーブル auth_user および labelType には、ラベルへの追加情報が含まれています。

このSQL文をweb2pyに変換するのを手伝ってくれませんか:

SELECT labelType.name, imageLabel.labelValue, auth_user.first_name, auth_user.last_name  from imageLabel
LEFT JOIN labelType 
ON imageLabel.labelId = labelType.id
LEFT JOIN auth_user
ON imageLabel.userId = auth_user.id
WHERE imageLabel.imageId = 581
ORDER BY labelType.name

データモデルは次のようになります。

db.define_table('labelType',
    Field('name','string'),
)
db.define_table('imageLabel',
    Field('imageId','string'),
    Field('labelId','integer'),
    Field('userId','integer'), 
    Field('labelValue','text'),
)
db.define_table('image',
    Field('imageId','string')
)
# + built-in auth tables

私の試みは:

labels = db((db.imageLabel.id == db.labelType.id) ).select( 
        db.imageLabel.labelValue, db.labelType.name, db.auth_user.first_name, db.auth_user.last_name, db.imageLabel.labelTimeStamp, 
        left=db.auth_user.on(db.imageLabel.userId==db.auth_user.id)
        )

コードに WHERE imageLabel.imageId = 581 部分がないため、明らかに機能しません。そして、web2pyで2つの「JOINS」とともにWHEREを使用する方法がわかりません:-(

助けてくれてありがとう!

編集:解決策アンソニーからの回答を読んだ後:

labels = db(
    db.imageLabel.imageId == img.id
).select(
    db.imageLabel.labelValue,
    db.labelType.name,
    db.auth_user.first_name,
    db.auth_user.last_name,
    db.imageLabel.labelTimeStamp,
    left=[
        db.labelType.on(db.imageLabel.labelId == db.labelType.id),
        db.auth_user.on(db.imageLabel.userId==db.auth_user.id)
    ],
    orderby=~db.labelType.name
)
4

1 に答える 1

5

一般に、select は次のようになりdb(query).select(...)ます。そのquery部分がWHERE節を表しています。複数のWHERE句がある場合は、&演算子を使用するだけです。

db((condition 1) & (condition 2) & ...)

left joinsに関しては、複数の left join を指定する必要がある場合、メソッドのleft引数はリストにすることができます:.select()

left=[db.auth_user.on(db.imageLabel.userId==db.auth_user.id),
      db.labelType.on(db.imageLabel.labelId==db.labelType.id)]

ただし、ここで本当に左結合が必要かどうかは明確ではありません。内部結合が必要な場合もあります (メソッドのjoin引数を使用して指定する.select()か、より簡単にクエリの条件として指定できます)。

db((db.imageLabel.labelId == db.labelType.id) &  # joins imageLabel and labelType
   (db.imageLabel.userId == db.auth_user.id) &  # joins imageLabel and auth_user
   (db.imageLabel.imageId == 581))\
  .select(db.imageLabel.labelValue, db.labelType.name, db.auth_user.first_name,
          db.auth_user.last_name, db.imageLabel.labelTimeStamp)

また、おそらく 3 つの「Id」フィールドを参照型フィールドとして指定する必要があります。

db.define_table('imageLabel',
    Field('imageId', 'reference image'),
    Field('labelId', 'reference labelType'),
    Field('userId', 'reference auth_user'),
    Field('labelValue', 'text'),
)

最後に、なぜ imageId 文字列フィールドが必要なのですか? db.image テーブルには、テーブルの主キーとして機能し、各画像を一意に識別する自動インクリメント整数「id」フィールドが既に含まれています。

于 2013-06-01T22:09:25.847 に答える