В моем приложении для маркировки изображений я хочу отобразить список ярлыков, назначенных изображению, а также информацию типа Lable и пользователя, которые назначили эту метку. Основной стол - это изображениеLabel. Таблицы auth_user и labelType содержат дополнительную информацию на этикетке.Двойной JOIN в web2py. Как применить этот SQL в web2py?
Не могли бы вы мне помочь преобразовать этот 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)
)
Какие abviously не работает, поскольку в коде отсутствует WHERE imageLabel.imageId = 581. И я не могу понять, как использовать, где наряду с 2 «СТАЛ» в web2py :-(
Большое спасибо заранее за любую помощь
EDIT: РЕШЕНИЕ После прочтения ответа от Энтони:
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
)
+1: Благодарим за ценные предложения! Использование списка в качестве левого значения было ключом! Теперь это работает, и я добавил решение к моему вопросу. Особенно большое спасибо за хорошее объяснение для db(). Select(). Я не получил его из онлайн-книги. Что касается [image.imageId], имя действительно вводит в заблуждение. Фактически это поле хранит 32-символьное длинное хэш-значение изображения, чтобы предотвратить импорт существующих изображений. Это не первичный ключ таблицы изображений (однако это может быть, поскольку эти значения также уникальны) –
О, теперь я вижу, в моей схеме была другая ошибка. Вы имели в виду imageLabel.imageId. Это была бессмыслица. Еще раз спасибо! –