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

Проверено и работает

Другие вопросы по тегам