Та же проблема принесла мне здесь. Я использую Сервер Ubuntu 12.04. Ни одно из вышеупомянутых решений не решило мою проблему, таким образом, я попробовал другие решения.
я просто открыл sources.list на/etc/apt и узнал, что некоторые источники "ограничиваются".
Просто редактируют sources.list и удаляют "ограниченный" параметр, и он хорошо работает теперь :)
Hope, которая работает на других также!
Вы должны использовать подготовленный оператор, потому что то, что вы хотите сделать, можно сделать только с помощью динамического SQL:
SET @stmt = 'SELECT * FROM YOUR_TABLE WHERE 1 = 1 '
SET @stmt = CONCAT(@stmt, (SELECT CONCAT_WS(' AND ', CONCAT(column_name, ' = 1 '))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'YOUR_TABLE'
AND table_schema = 'db_name'
AND column_name NOT IN ('id')));
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Первый оператор SET создает базовый оператор SELECT; часть «1 = 1» предназначена только для того, чтобы упростить конкатенацию « AND column = 1
»
Второй оператор SET объединяет содержимое запроса, чтобы получить список столбцов на основе имя таблицы в конце строки в первом операторе SET. Идея состоит в том, что это:
SELECT CONCAT_WS(' AND ', CONCAT(column_name, ' = 1 '))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'YOUR_TABLE'
AND table_schema = 'db_name'
AND column_name NOT IN ('id')
... вернет строку вида « И январь = 1 И февраль = 1 ...
». Вы'
Вы можете использовать векторы в MySQL:
select * from table where (january, february) = (1, 1)
Остерегайтесь различных сопоставлений сервера и клиента для текстовых столбцов, возможно, тогда вам потребуется явно указать сопоставление.
По моему мнению, это вызвано плохим дизайном таблицы (я предполагаю, что это просто пример вашей проблемы, но терпите меня, и я думаю, что эта концепция может быть смоделирована лучше.
Вот таблицы:
Things Things_Months Months
thing_id thing_id Month_id
thing_info month_id Month_Name
thing_month_id order_field
, а здесь будет sql:
select thing_info, month_name
from things, things_months, months
where things.thing_id = things_months.thing_id
and things_months.month_id = months.month_id
order by things.things_info, months.order_field
Результатом будет
thingy 1, January
thingy 1, February
thingy 2, April
thingy 3, November
thingy 3, December
Я понимаю, что пытается сделать мистер Смит.
Речь идет о 12 строках x 4 столбца против 1 строки x 12 столбцов.
Прежний дизайн таблицы был бы таким. что-то вроде:
id, чей-то id, месяц, значение x 12 в месяц
1, 101, january, 1
2, 101, february, 1
3, 101, march, 0
etc..
Соответствующий оператор sql для этого будет:
$sqlQuery = "SELECT month FROM my_month_table WHERE value = 1";
То, что я предполагаю, пытается мистер Смит:
id, чей-то id, январь, февраль, март ...
$sqlQuery = "SELECT corrensponding_column_names_to_where_clause FROM my_month_table WHERE column_value = 1";
Вы можете сделать это с помощью сопоставления ... с.
В этом случае ваша таблица должна быть таблицей MyISAM, и вы должны создать индекс FULLTEXT, включая обязательные столбцы.
Попытайтесь создать представление
CREATE VIEW v_months
AS
SELECT *, CONCAT( CAST(jan AS CHAR(1)),
CAST(feb AS CHAR(1)),
CAST(mar AS CHAR(1)),
...) AS all
FROM months
Вы получите что-то вроде этого:
aa, 0, 0, 1, 0, 0010
ab, 1, 0, 1, 0, 1010
ac, 1, 1, 0, 0, 1100
ad, 1, 1, 1, 0, 1110
И затем вы можете запросить
SELECT * FROM v_months WHERE all = '100110010101'
Или, если вы хотите, запрос "получить все строки, где feb = 1 "можно написать так:
SELECT * FROM v_months WHERE all LIKE '_1____________'
где '_' соответствует ровно одному символу.
Что вам нужно, так это операция отмены поворота. Microsoft SQL Server поддерживает PIVOT
и UNPIVOT
как расширения стандартного SQL. Я не знаю какой-либо другой марки СУБД, которая поддерживает встроенные функции поворота / отмены поворота. Конечно, MySQL не поддерживает это.
Вы не можете использовать поиск FULLTEXT
в этом случае, потому что, как сказано в документации , :
могут использоваться только полнотекстовые индексы с таблицами MyISAM и может быть создан только для столбцов CHAR, VARCHAR или TEXT.
И это не избавит вас от необходимости указывать столбцы в любом случае, потому что предикат MATCH ()
требует, чтобы вы перечислили все столбцы в полнотекстовом индексе.
Если вы можете'
Как насчет решения проблемы с помощью ПРОСМОТРА?
CREATE TABLE `d001ab05`.`months` (
`id` INT NOT NULL ,
`jan` BOOL NOT NULL ,
`feb` BOOL NOT NULL ,
`mar` BOOL NOT NULL ,
`apr` BOOL NOT NULL ,
`may` BOOL NOT NULL ,
`jun` BOOL NOT NULL ,
`jul` BOOL NOT NULL ,
`aug` BOOL NOT NULL ,
`sep` BOOL NOT NULL ,
`oct` BOOL NOT NULL ,
`nov` BOOL NOT NULL ,
`dec` BOOL NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB;
Вставить данные:
INSERT INTO `d001ab05`.`months` (
`id`, `jan`, `feb`, `mar`, `apr`, `may`, `jun`,
`jul`, `aug`, `sep`, `oct`, `nov`, `dec`
) VALUES (
'1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'
), (
'2', '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'
), (
'3', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'
), (
'4', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1'
);
Просмотр с выбором:
CREATE OR REPLACE VIEW `moncase` AS
SELECT id,
CASE WHEN `jan` =1 OR `feb` =1 OR `mar` =1 OR `apr` =1 OR `may` =1 OR
`jun` =1 OR `jul` =1 OR `aug` =1 OR `sep` =1 OR `oct` =1 OR `nov` =1 OR `dec` =1
THEN 1 ELSE 0 END AS or_over_months
FROM months;
Выбрать:
SELECT * FROM `moncase` WHERE `or_over_months` = 1;
Результат:
id | or_over_months
1 | 1
2 | 1
4 | 1