Как возвращение реестра, который содержит несколько стоимости, отделенной запятой

У меня есть эта таблица в базе данных:

Tabla de Ejemplo:
id  - registro - valor
1   - compras  - 1,2,6
2   - ventas   - 3,4
3   - deudas   - 5

Я хочу сделать консультацию, где я послал только число 3 и принес реестр 2 в этом примере.

Я попытался с IN и он это не делает, я это протестировал с CONTAINS и также он это не делает.

Что я должен делать?

4
задан 19.08.2016, 16:28
2 ответа

Query ища стоимость, отделенную запятыми

Есть несколько альтернатив:

  1. Функция find_in_set возврати индекс, в котором один string он находится внутри одной lista de strings (отделенные запятой).

    select * from tabla where find_in_set('3',valor) > 0;
    


  2. Добавляя запятую раньше и после поля, чтобы гарантировать, что вся стоимость была окружена запятыми (даже первый и последний). Таким образом, мы можем использовать like

    select * from tabla where concat( ',', valor, ',') like '%,3,%';
    


  3. Используя регулярные выражения и оператора regexp

    select * from tabla where valor regexp '(,|^)3(,|$)';
    


Рекомендуемый способ это делать

Я рекомендую, под каждой точкой зрения, не прилагать различную стоимость внутри того же поля. Взамен, использовать такую структуру как следующая:

╔════╦══════════╦═══════╗
║ id ║ registro ║ valor ║
╠════╬══════════╬═══════╣
║  1 ║  compras ║   1   ║
╠════╬══════════╬═══════╣
║  1 ║  compras ║   2   ║
╠════╬══════════╬═══════╣
║  1 ║  compras ║   6   ║
╠════╬══════════╬═══════╣
║  2 ║  ventas  ║   3   ║
╠════╬══════════╬═══════╣
║  2 ║  ventas  ║   4   ║
╠════╬══════════╬═══════╣
║  3 ║  deudas  ║   5   ║
╚════╩══════════╩═══════╝

Эта структура будет облегчать тебе любую операцию, которую ты хотел бы сделать, и будет форма, в которой относительная таблица и механизм базы данных был разработан, чтобы использовать. Таким образом, логически он гораздо более простой и быстрый:

select * from tabla where valor = 3;


И идя шаг дальше, мы могли бы нормализовать основание, чтобы не иметь столько дублированной стоимости занимая место из-за остальных. Она была бы структурой как следующая:

 Tabla: principal               Tabla: nombresRegistros
╔════╦══════════╦═══════╗      ╔══════════╦═════════════════╗
║ id ║ registro ║ valor ║      ║ registro ║ registro_nombre ║
╠════╬══════════╬═══════╣      ╠══════════╬═════════════════╣
║  1 ║     1    ║   1   ║      ║     1    ║     compras     ║
╠════╬══════════╬═══════╣      ╠══════════╬═════════════════╣
║  1 ║     1    ║   2   ║      ║     2    ║      ventas     ║
╠════╬══════════╬═══════╣      ╠══════════╬═════════════════╣
║  1 ║     1    ║   6   ║      ║     3    ║      deudas     ║
╠════╬══════════╬═══════╣      ╚══════════╩═════════════════╝
║  2 ║     2    ║   3   ║
╠════╬══════════╬═══════╣
║  2 ║     2    ║   4   ║
╠════╬══════════╬═══════╣
║  3 ║     3    ║   5   ║
╚════╩══════════╩═══════╝

Даже, если бы ты захотел получить формат, с которым ты работал начиная с этой структуры, он был бы получен следующим query:

select id, registro_nombre, group_concat(principal.valor) as valor
from principal
left join nombresRegistros
on principal.registro = nombresRegistros.registro
group by id;


Это форма, в которой лучше ты сможешь управлять о базе данных.

5
ответ дан 24.11.2019, 13:37

Если это является цепью то, что ты сохраняешь в колонне стоимость, ты мог бы использовать статью LIKE sql

SELECT * FROM tu_tabla WHERE valor LIKE '%3%';

То, что возвратит тебе реестры, которые будут содержать 3 в колонне, стоимость.

3
ответ дан 24.11.2019, 13:37
  • 1
    Это верно @Mariano, используя это s и # 243; это как он говорит, что Хуан функционирует верно. –  Jose FG 19.08.2016, 13:39
  • 2
    Нет, это может приносить много фальшивых результатов, что такой строки, у которых есть стоимость 13, 23, 30 до 39, и ты и т.д. не можешь искать все то, что содержит число, так как это subset любой другой вещи, которую он не соединяет –  Philippe Thomassigny 19.08.2016, 20:11
  • 3
    Я это чувствую друг juan, но так оно не функционирует также, потому что, если у меня есть реестр, который содержал бы 30 или 300 или 31, он это возвращает равно –  Josué Leo Moreno 28.12.2016, 19:50