Я хочу случайным образом выбрать 4 строки, которые отличаются друг от друга и не имеют записи, соответствующей ни одному из 4 выбранных столбцов.
Вот что я закодировал:
SELECT DISTINCT en,dialect,fr FROM words ORDER BY RANDOM() LIMIT 4
Вот некоторые данные:
**en** **dialect** **fr**
number SFA numero
number TRI numero
hotel CAI hotel
hotel SFA hotel
Я хочу:
**en** **dialect** **fr**
number SFA numero
hotel CAI hotel
Некоторые извлеченные строки будут иметь что-то похожее друг с другом, например, один и тот же en или один и тот же fr. Я хотел бы получить строки, которые не имеют ничего похожего друг с другом, как мне это сделать?
Отлично, теперь просто добавьте образец данных к своему вопросу.
хорошо, я отредактировал вопрос


Думаю, я бы сделал это во внешнем коде, а не в дБ, вот псевдокод (не знаю, как выглядит ваш узел):
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, и, возможно, он сделал что-то глупое со всеми апострофами и цитатами (превратил их в фигурные, которые предпочитают писатели, а не в прямые, используемые программистами)
Вы можете использовать Rank или найти первую строку для каждой группы для достижения вашего результата,
Проверьте ниже, я надеюсь, что этот код вам поможет
ВЫБЕРИТЕ 'number' как Col1, 'SFA' как Col2, 'numero' как Col3 INTO #tbl СОЮЗ ВСЕ ВЫБЕРИТЕ 'число', 'TRI', 'число' СОЮЗ ВСЕ ВЫБЕРИТЕ 'отель', 'CAI', 'отель' СОЮЗ ВСЕ ВЫБЕРИТЕ 'гостиница', 'SFA', 'гостиница' СОЮЗ ВСЕ ВЫБЕРИТЕ 'Location', 'LocationA', 'Location data' СОЮЗ ВСЕ ВЫБЕРИТЕ «Местоположение», «МестоположениеB», «Данные местоположения» ; С резюме КАК ( ВЫБЕРИТЕ Col1, Col2, Col3, ROW_NUMBER () OVER (РАЗДЕЛЕНИЕ ПО p.Col1 ORDER BY p.Col2 DESC) AS rk ОТ # тбл п) ВЫБЕРИТЕ s.Col1, s.Col2, s.Col3 ИЗ резюме s ГДЕ s.rk = 1
DROP TABLE #tbl
Я использую sqlite с nodeJS