MySQL/MySQLi выбирают из таблицы, пока не будет найдено заданное значение
Я долго об этом искал и, похоже, не могу найти то, что мне подходит, поскольку каждый подобный вопрос касается достижения определенной суммы столбца.
Я ищу способ поиска записей в таблице, в которой есть несколько общих значений столбцов - они не являются последовательными записями в таблице, но они должны быть последовательными записями, когда общие значения учитываются, - и извлекать все записи до один конкретный столбец имеет другое значение.
Учитывая данные:
PrimaryID SecondaryID TertiaryID Limit DateTime
12 9 4 1 2013-03-22 00:00:14
11 9 4 1 2013-03-22 00:00:13
10 54 11 0 2013-03-22 00:00:12
9 9 4 1 2013-03-22 00:00:11
8 9 23 1 2013-03-22 00:00:10
7 9 4 1 2013-03-22 00:00:09
6 9 4 0 2013-03-22 00:00:08
5 9 16 0 2013-03-22 00:00:07
4 72 32 0 2013-03-22 00:00:06
3 9 4 1 2013-03-22 00:00:05
2 9 4 1 2013-03-22 00:00:04
1 9 4 0 2013-03-22 00:00:03
Я пытаюсь получить записи с SecondaryID=9 и TertiaryID=4 до Limit=0 (по заказу DateTime DESC).
Используя PrimaryID 12 в качестве отправной точки, я ожидал бы следующее:
PrimaryID SecondaryID TertiaryID Limit DateTime
12 9 4 1 2013-03-22 00:00:14
11 9 4 1 2013-03-22 00:00:13
9 9 4 1 2013-03-22 00:00:11
7 9 4 1 2013-03-22 00:00:09
И для PrimaryID 3 в качестве отправной точки:
PrimaryID SecondaryID TertiaryID Limit DateTime
3 9 4 1 2013-03-22 00:00:05
2 9 4 1 2013-03-22 00:00:04
В настоящее время я извлекаю каждый результат для SecondaryID=9 и TertiaryID=4, а затем зацикливаю его в PHP - и с сотнями результатов (и растущими каждую неделю) он слишком медленный, чтобы работать в производстве.
Я также с радостью приму решение, специфичное для MySQLi, так как мы собираемся перейти на MySQLi вместо MySQL.
2 ответа
Я понял, что иду по этому запросу неправильно.
Вместо того, чтобы "считать в обратном направлении" от заданной точки в данных, чтобы увидеть, когда предел впервые стал =1 в последовательности, мне вместо этого нужно было искать предыдущее вхождение предела =0, а затем выполнять запрос вперед до моего начального PrimaryID.
Результирующий запрос, который охватывает все, что мне нужно, это
SELECT * FROM table1 WHERE SecondaryID='9' AND TertiaryID='4' AND `Limit`='1' AND PrimaryID<='3' AND `DateTime`>= (SELECT `DateTime` FROM table1 WHERE SecondaryID='9' AND TertiaryID='4' AND `Limit`='0' AND PrimaryID<='3' ORDER BY `DateTime` DESC LIMIT 1) ORDER BY `DateTime` DESC
Запрос будет
SELECT * FROM table_name
WHERE PrimaryID <= 12(your_id) AND SecondaryID=9 and TertiaryID=4 AND Limit=1
ORDER BY DateTime DESC
Проверено и работает