Nano Hash - криптовалюты, майнинг, программирование

Выбор нескольких строк разного типа из одной таблицы с заданными критериями, если они не найдены, выберите следующую возможную строку

У меня есть таблица настроек, в которой есть такие столбцы, как тип, значение, компания, группа. Из этой таблицы мне нужно выбрать только одну строку каждого другого типа в зависимости от того, совпадает ли моя информация о пользователе с другими столбцами или нет.

Пример. Я в компании 1 и в группе 1, и моя таблица настроек состоит из следующих строк:

+--+-----+-------+---------+-------+
|id|type | value | company | group |
+--+-----+-------+---------+-------+
|1 |1    | 50    | 1       | 1     |
|2 |1    | 70    | NULL    | NULL  |
|3 |2    | 1     | NULL    | NULL  |
|4 |2    | 99    | 1       | 1     |
|5 |2    | 999   | NULL    | 1     |
|6 |3    | 500   | NULL    | NULL  |
+--+-----+-------+---------+-------+

Если есть настройка для компании или группы, используйте ее, в противном случае используйте строку по умолчанию (компания и группа имеют значение NULL). Есть еще пара столбцов, таких как компания и группа.

Из этой таблицы мне нужно выбрать id:s 1,4 и 6, потому что это настройки, которые мне нужны в данном случае. Id 1 и id 4 совпадают с моей информацией о пользователе, id 5 тоже совпадает, но id 4 точно совпадает. Идентификатор 6 соответствует, потому что нет более близкой настройки типа 3.

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

Я попытался выбрать строки и упорядочить их с помощью компании DESC, но при группировке типа это не сработает. Я также пытался присоединиться к max(company), где компания IS NOT NULL, но я застрял и теперь пытаюсь получить помощь.

Буду признателен, если кто-нибудь поможет мне в этом деле!

04.10.2012

  • В вашем примере выше, какую запись вы бы хотели для type=2, если id=4 было (company, group) = (1, NULL)? И id=3, и id=4 будут совпадать в одном поле, но не в другом. Есть ли у кого-то приоритет? 04.10.2012
  • id 4 является точным совпадением, поэтому он имеет приоритет и должен быть в результате. Также идентификатор 4 имеет больший приоритет, чем идентификатор 5, потому что идентификатор 5 является частичным совпадением. 04.10.2012
  • Да, но в случае, когда у id=4 было (company, group) = (1, NULL)? 04.10.2012
  • id=4 это (компания, группа) = (1,1). 04.10.2012
  • Мой вопрос был: ЧТО ЕСЛИ. 04.10.2012
  • ой, извини. Хороший вопрос. В этом случае группа 1 должна принадлежать компании 1. Есть и другие столбцы, где это не так, но это другое дело.. 04.10.2012
  • Итак, как бы вы разрешили такие коллизии? Должен ли один столбец иметь приоритет над другим? 04.10.2012
  • Я думаю, что мне нужно создать некоторые правила проверки при изменении и создании этих настроек. Тысяча благодарностей за совет!! 04.10.2012

Ответы:


1
SELECT * FROM my_table WHERE id IN (
  SELECT (
    SELECT   b.id
    FROM     my_table b
    WHERE    b.type = a.type
         AND IFNULL(b.company = 1, TRUE)
         AND IFNULL(b.group   = 1, TRUE)
    ORDER BY b.company DESC, b.group DESC
    LIMIT    1
  ) FROM (
    SELECT DISTINCT type FROM my_table
  ) a
)

См. его на sqlfiddle.


Переписать в JOIN, что должно повысить производительность:

SELECT my_table.*
FROM   my_table
JOIN (
  SELECT DISTINCT type FROM my_table
) a ON my_table.id = (
  SELECT   b.id
  FROM     my_table b
  WHERE    b.type = a.type
       AND IFNULL(b.company = 1, TRUE)
       AND IFNULL(b.group   = 1, TRUE)
  ORDER BY b.company DESC, b.group DESC
  LIMIT    1
)

См. его на sqlfiddle.

04.10.2012
  • Кажется, это работает. Я проверю это завтра в большой базе данных. Спасибо!! 04.10.2012
  • Это то, что я ожидал! Первый запрос занял слишком много времени (44 секунды), чтобы получить 40 различных типов настроек из 5000 строк (возможно, нереальное количество), но с JOIN это заняло 0,016 секунды. Я знал, что это возможно с JOIN, но понятия не имел, как это сделать. Миллоин еще раз спасибо!! 05.10.2012
  • @Limitteri: в зависимости от вашей индексации вы можете повысить производительность, заменив IFNULL(b.company = 1, TRUE) на (b.company = 1 OR b.company IS NULL) и аналогичным образом для b.group. 05.10.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..