#sql
#sql
Вопрос:
Я пытаюсь случайным образом захватить около 20 случайных строк из таблицы, затем, используя команду INNER JOIN, добавить около 7 столбцов дополнительных данных к этим строкам из другой таблицы на основе общего идентификатора.
База данных содержит 2 таблицы, первая (listings) индексируется по идентификатору (в котором есть пробелы), вторая (listingselements) имеет 7 пар field_name / field_value для каждого идентификатора в первой таблице. Меня интересуют 5 из них.
Я не могу понять, как это сделать. Можно ли это сделать в базе данных или это должно выполняться в нескольких запросах программно?
SELECT listings.id, listings.title, listings.featured, listingselements.field_name, listingselements.field_value
FROM listings
INNER JOIN listingselements
ON listings.id = listingselements.id
WHERE RAND()<(SELECT ((20/COUNT(*))*10) FROM listings)
AND (listingselements.field_name = "price"
OR listingselements.field_name = "bathrooms"
OR listingselements.field_name = "bedrooms"
OR listingselements.field_name = "sq_meter"
OR listingselements.field_name = "city")
ORDER BY RAND();
Функция WHERE/ORDER С ПОМОЩЬЮ RAND() отлично работает, однако запрос не захватывает столбцы ВНУТРЕННЕГО соединения перед переходом к следующему элементу.
Комментарии:
1. Небольшая опечатка с элементами listingsdbelements? в предложении on отображаются элементы listingselements (без базы данных)
2. Да, только что исправлено, я изменил имена переменных для вопроса, поскольку они слишком длинные.
Ответ №1:
попробуйте поместить случайные 20 процентов во внутренний select в предложении from
select inner_listings.id, inner_listings.title, inner_listings.featured,
listingselements.field_name, listingsdbelements.field_value
from
(SELECT listings.id, listings.title, listings.featured
FROM listings
WHERE RAND()<(SELECT ((20/COUNT(*))*10) FROM listings)
ORDER BY RAND()) inner_listings
inner join listingselements ON inner_listings.id = listingselements.id
where (listingselements.field_name = "price"
OR listingselements.field_name = "bathrooms"
OR listingselements.field_name = "bedrooms"
OR listingselements.field_name = "sq_meter"
OR listingselements.field_name = "city")