#mysql
#mysql
Вопрос:
Привет, я создал таблицу под названием allposs со всеми возможными результатами лотереи из 6/49 lotto, которая казалась достаточно простой.
create table allposs (
`id` mediumint (8) unsigned NOT NULL,
`n1` tinyint (3) unsigned NOT NULL,
`n2` tinyint (3) unsigned NOT NULL,
`n3` tinyint (3) unsigned NOT NULL,
`n4` tinyint (3) unsigned NOT NULL,
`n5` tinyint (3) unsigned NOT NULL,
`n6` tinyint (3) unsigned NOT NULL,
key `id` (`id`)
) engine=myisam;
Создал процедуру для генерации результатов и размещения их в таблице
которая работала нормально.
Теперь мне нужно создать другие таблицы, используя результаты из этой таблицы, например.
Создайте таблицу «filter1», которая содержит все результаты, которые являются последовательными 1,2,3,4,5,6 / 44,45,46,47,48,49
и другой «filter2», который имеет 5 последовательных 1,2,3,4,5,25, / 1,10,11,12,13,14, затем 4consec 1,2,3,4,13,23, / 1,16,17,18,19.49 и так далее.
Как только я создам все это, мне нужно просмотреть / выбрать таблицу «allposs» — минус «filter1», «filter2» и т. Д.
Я очень новичок в mysql php и у меня нет денег, чтобы заплатить профессионалу, поэтому я пытаюсь сделать это сам, но я думаю, что это займет целую вечность, поскольку я просматривал последние 2 недели и не могу найти решение. У меня есть очень базовые навыки программирования, но я полон решимости учиться. Пожалуйста, любая помощь была бы высоко оценена. Я использую mysql 5.1.54 в ubuntu 11.4
Комментарии:
1. Не создавайте таблицы. Используйте представления для отображения данных так, как вы хотите. Вам также нужно будет выполнить минус , который является операцией set.
2. спасибо Бен за ваш комментарий, но мне нужны таблицы для выполнения других действий, связанных с веб-сайтом, который я пытаюсь настроить, и я подумал, что это будет проще и быстрее, поскольку у меня есть 23 различных фильтра / таблицы, которые мне нужно создать и использовать.
3. Хорошо, я думаю, что мне нужно левое соединение здесь, как-то я посмотрел на ПРЕДСТАВЛЕНИЯ, но не думаю, что это то, что мне нужно.
4. @MarkRobinson: Хранятся ли ваши числа в таблице как
(2,3,4,6,12,45)
или возможно, что некоторые строки расположены не в порядке возрастания, как(2,4,3,45,12,6)
?5. @ypercube только что проверил, и да, там все в порядке 2,3,4,6,12,45, а не 2,4,3,45,12,6. если бы я мог найти пример только из 2 последовательных чисел, я мог бы разобраться с остальным.
Ответ №1:
Это будут довольно медленные запросы, потому что вы ищете в довольно большой таблице.
Найдите строки, в которых все 6 чисел являются последовательными.
Медленно:
SELECT *
FROM allposs
WHERE n2 = n1 1
AND n3 = n2 1
AND n4 = n3 1
AND n5 = n4 1
AND n6 = n5 1
Быстрее:
Добавьте составной индекс (n1,n2,n3,n4,n5,n6)
в свою таблицу.
Также добавьте (n2,n3,n4,n5,n6)
индекс, (n3,n4,n5,n6)
единицу и т.д., вплоть до (n6)
индекса.
Затем создайте единую таблицу с одним столбцом и 49 строками:
CREATE TABLE num
( i TINYINT
, PRIMARY KEY (i)
) ;
Затем используйте это:
SELECT
ap.*
FROM
allposs AS ap
JOIN
num
ON (n1,n2,n3,n4,n5,n6) = (i,i 1,i 2,i 3,i 4,i 5)
Найдите строки, в которых 5 чисел являются последовательными.
Медленно:
SELECT *
FROM allposs
WHERE n2 = n1 1
AND n3 = n2 1
AND n4 = n3 1
AND n5 = n4 1
AND n6 > n5 1
UNION
SELECT *
FROM allposs
WHERE n2 > n1 1
AND n3 = n2 1
AND n4 = n3 1
AND n5 = n4 1
AND n6 = n5 1
Быстрее:
SELECT
ap.*
FROM
allposs AS ap
JOIN
num
ON ( (n1,n2,n3,n4,n5) = (i,i 1,i 2,i 3,i 4) AND n6 > i 5 )
OR ( n1 < i-1 AND (n2,n3,n4,n5,n6) = (i,i 1,i 2,i 3,i 4) )
Вы можете использовать эти запросы с CREATE TABLE anothertable SELECT ...
или с INSERT INTO anothertable SELECT ...
вариантами для заполнения большего количества таблиц, если хотите иметь доступ к этим строкам без необходимости запускать запросы каждый раз.
Комментарии:
1. спасибо, это здорово, я понимаю, что пример с 6 номерами немного запутался в первом номере 5, но я все еще учусь. также, как бы я поместил результаты в новую таблицу filter1, например. должен ли я сначала создать table filter1, а затем ВСТАВИТЬ В или я мог бы отредактировать ваш пример и сделать все это в одном.?
2. Чтобы сделать все это в одном, используйте
CREATE TABLE anothertable SELECT ...
синтаксис (подробности см. по ссылке)3. Спасибо, теперь я начинаю видеть в этом логику, я думаю, вы были действительно полезны, гений. я собираюсь создать таблицы и провести несколько тестов. У меня есть еще 1 вопрос, который, я думаю, проверит вас, но я сохраню его на более поздний срок, когда у меня будет возможность узнать немного больше о себе и больше привыкнуть к mysql. Еще раз большое спасибо.
4. Вы могли бы попробовать сыграть сначала с меньшими числами (например, лотерея 3/13), чтобы ваши запросы не истекли по времени и не поставили БД на колени, даже без индексов. Вы также можете поэкспериментировать с
EXPLAIN SELECT ...
(и с различными индексами), чтобы увидеть, как и будут ли использоваться индексы.5. не могли бы вы помочь еще раз, пожалуйста, я закончил создание своей базы данных, у меня есть таблица allposs и 23 таблицы фильтров, которые я хочу использовать для просмотра оставшихся результатов, оставшихся в allposs, когда все или некоторые из них в моих таблицах фильтров были вычтены.? я посмотрел, где id ОТСУТСТВУЕТ, и оставил примеры соединения, но не могу понять, как реализовать их в моем запросе. Меня не беспокоит скорость, просто самый простой способ сделать это.
Ответ №2:
Поскольку числа в столбцах расположены по порядку — то есть n1 < n2 и т.д. — Вы можете получить множество в одном запросе:
select *
from (select
id,n1,n2,n3,n4,n5,n6,
(n1=n2-1) (n2=n3-1) (n3=n4-1) (n4=n5-1) (n5=n6-1) as consecutive_count
from allposs) x
) where consecutive_count > 0
order by consecutive_count desc, n1,n2,n3,n4,n5,n6;
Этот запрос сначала вернет все комбинации с 6 последовательными числами, затем все комбинации с 5 последовательными числами и т.д. И не вернет никаких комбинаций, которые не имеют последовательных чисел.
Получив это, вы сможете написать свой php для обработки строк.
Если вы хотите использовать отдельные запросы, измените условие на where consecutive_count = 3
(например).
Комментарии:
1. Спасибо за совет альтернативного способа, но мне нужно создать таблицы для некоторых других задач. Я закончил создание своих таблиц и у меня есть 23 таблицы фильтров и моя основная таблица «allposs», я хочу иметь возможность вычитать столько таблиц фильтров, сколько захочу, из моей основной таблицы «allposs», Есть идеи, как это сделать? я не могу использовать оператор МИНУС, так что это будет left join или что-то в этом роде????
2. @MarkRobinson Я не знаю, чего вы пытаетесь достичь (с точки зрения бизнес-цели — в жизни техническая цель не имеет значения; важно то, что может сделать ваше решение, а не то, как оно это делает), но мой совет заключался бы в том, чтобы не использовать запросы и производные таблицы: используйте логику приложения, если можете. Иногда базы данных великолепны в решении проблем, а иногда они действительно дерьмовые. Похоже, что это в мусорном ведре. В любом случае, вам нужно сформулировать свой вопрос с точки зрения точного результата, предоставив указанный ввод, чего вы не сделали.
3. Я хочу иметь возможность просматривать оставшиеся результаты в таблице allposs, как только я уберу те, что в моих таблицах фильтров.?
4. Например. выберите * ИЗ всех возможных МИНУС fiter1, filter3, filter20
5. будет ли это SELECT * ИЗ allposs, ГДЕ * НЕ В (SELECT * ИЗ filter1 ) UNION SELECT * ИЗ allposs, ГДЕ * НЕ В (SELECT * ИЗ filter3) UNION SELECT * ИЗ allposs, ГДЕ * НЕ В (SELECT * ИЗ filter20) ; или есть другой способ?