2017-02-16 6 views
-2

У меня есть БД, в которой хранятся слова с идентификатором позиции. Например, следующие строки:MySQL SELECT WHERE IN Incrementing Value

Быстрый Браун Фокс перепрыгивает Lazy Dog

Идентификаторы позиция будет:

  1. Быстрый
  2. Brown
  3. Fox
  4. Прыгает
  5. За
  6. Ленивого
  7. Собака

То, что я хотел бы, чтобы выполнить то, что я выбираю строку, в которой Фокс следует непосредственно скачки. Я использую следующий синтаксис MySQL:

SELECT PositionIdentifier 
FROM TableName 
WHERE Word='Fox' 
    OR PositionIdentifier + 1 IN 
     (SELECT PositionIdentifier 
     FORM TableName 
     WHERE Word='Jumps' 
     ) 

Однако, предложение плюс одно не работает должным образом.

Как я мог достичь этого?

Update:

Оке, в clearify. Это мой стол:

 
StringID Word  Counter  Positions 

1   Fox  2   6|35 

1   Jumps 4   7|12|36|46 

1   Over  3   8|37|41 

Таким образом, из этого Tabel я хотел бы получить свои позиции, где Over следующим образом Переходов которых следовало Фокс. Поэтому в этом примере я хотел бы получить 6,7 и 8 в виде пары и 35, 36 и 37 в виде пары позиций

Надеюсь, это станет более ясным. Thx

+2

См. Http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple- sql-query – Strawberry

+0

Спасибо за ваш ответ, однако это не ват Я ищу –

+0

О, это определенно. – Strawberry

ответ

1

Дайте ему попробовать, как этот

SELECT PositionIdentifier 
FROM TableName 
WHERE Word='Fox' 
    AND PositionIdentifier IN 
     (SELECT (PositionIdentifier -1) AS PrevPosID 
     FROM TableName 
     WHERE Word='Jumps' 
     ) 

при условии, что ваша колонка PositionIdentifier является INT otherwhise вы, возможно, придется привести результат Substraction

+0

Спасибо, я попробовал ваш подход и с некоторыми ухищрениями, я смог заставить его работать, большое спасибо –

0

ли автообъединение на столе позиции, используя positionidentifier +1 в качестве условия соединения для получения строк, где jumps следует fox. Я предполагаю, что ваша positions таблицы имеет следующие 3 поля:

  • string_id: идентификатор строки, которая имеет слово. Слова с общим идентификатором строки. Если вы просто присоединяетесь к полю PositionIdentifier, то ваши результаты могут быть неправильными, так как несколько строк могут содержать эти 2 слова.

  • PositionIdentifier: определяет позицию данного слова в строке

  • слово: фактическое слово

Я хотел бы использовать следующий запрос:

select p1.string_id, p1.PositionIdentifier 
from positions p1 
inner join positions p2 on p1.string_id=p2.string_id and p1.PositionIdentifier+1=p2.PositionIdentifier 
where p1.Word='Fox' and p2.Word='Jumps' 

В качестве альтернативы, вы можете использовать exists() подзапрос, если вам не нужны какие-либо данные из записи «прыжки».

+0

Ну, я также хотел бы иметь PositionIdentifier второго слова. И что, если я не хочу найти Fox Jumps, но Fox перепрыгивает через. Запрос будет быстро расти, и мне нужно, чтобы все возвращаемые PositionIdentifiers –

+0

@TVAvanHesteren, вы должны были описать эти критерии в своем вопросе, а не в последующем комментарии к ответу. Btw, просто добавьте p2.PositionIdentifier в список выбора, и у вас есть желание. – Shadow

+0

да, я это понимаю. Можно ли также сделать SQL выбор позиции из | символьная разделительная строка? Например: позиции: | 6 | 58 | 74 | 97 | ? –

0

Я пробовал ваш sql, и похоже, что он работает нормально? Кроме того, что FROM был с ошибкой (FORM), и похоже, что вы хотите «И» вместо «ИЛИ» для чего хотите.

SELECT PositionIdentifier FROM TableName WHERE Word='Fox' OR PositionIdentifier+1 IN (SELECT PositionIdentifier FROM TableName WHERE Word='Jumps') 

Не могли бы вы пояснить, что вы имеете в виду под термином «предложение плюс одно не работает должным образом»?

+0

Слова и позиции хранятся в разных таблицах, см. Выше обновление –