Я думаю, что я сделал бы это в коде переднего конца, а не в дБ, вот псевдокод (не знаю, как выглядит ваш узел):
var seenEn = “en not in (''“;
var seenFr = “fr not in (''“;
var rows =[];
while(rows.length < 4)
{
var newrow = sqlquery(“SELECT *
FROM table WHERE “ + seenEn + “) and ”
+ seenFr + “) ORDER BY random() LIMIT 1”);
if(!newrow)
break;
rows.push(newrow);
seenEn += “,‘“+ newrow.en + “‘“;
seenFr += “,‘“+ newrow.fr + “‘“;
}
Цикл выполняется столько раз, сколько необходимо для извлечения 4 строк (или, возможно, сделать его циклом for, который выполняется 4 раза), если запрос не возвращает значение NULL. Каждый раз, когда запрос возвращает значения, добавляются в список значений, мы не хотим, чтобы запрос возвращался снова. Этот список должен был начинаться с некоторых значений (null), которые никогда не находятся в данных, чтобы предотвратить синтаксическую ошибку при конкатенации строки запятой в переменную seenXX. Этих синтаксических ошибок можно избежать другими способами, такими как логическое значение «если это первое значение, не ставьте запятую», но я решил поместить фиктивные неэффективные значения в sql, чтобы упростить JS. То же самое касается
Как уже отмечалось, JS выглядит, чтобы облегчить ваше понимание, но это следует рассматривать как псевдокод, описывающий общий алгоритм - он никогда не был скомпилирован / выполнен / протестирован и может иметь синтаксические ошибки или вообще не работать как JS, если вставлен в ваш файл; возьмите идею и используйте ее в своем решении
Пожалуйста, обратите внимание, что это было отправлено с iphone, и это могло сделать что-то глупое со всеми апострофами и цитатами (превратило их в курчавый вид, предпочитаемый авторами, а не прямой вид, используемый программистами)