Соответствие значению к нескольким столбцам (в одном операторе) от MySQL использования таблицы

Та же проблема принесла мне здесь. Я использую Сервер Ubuntu 12.04. Ни одно из вышеупомянутых решений не решило мою проблему, таким образом, я попробовал другие решения.

я просто открыл sources.list на/etc/apt и узнал, что некоторые источники "ограничиваются".

Просто редактируют sources.list и удаляют "ограниченный" параметр, и он хорошо работает теперь :)

Hope, которая работает на других также!

9
задан Mr. Smith 4 September 2009 в 03:25
поделиться

9 ответов

Вы должны использовать подготовленный оператор, потому что то, что вы хотите сделать, можно сделать только с помощью динамического 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 ... ». Вы'

4
ответ дан 4 December 2019 в 23:06
поделиться

Вы можете использовать векторы в MySQL:

select * from table where (january, february) = (1, 1)

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

0
ответ дан 4 December 2019 в 23:06
поделиться

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

  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
0
ответ дан 4 December 2019 в 23:06
поделиться
select * from table where 1 in (january, february)
0
ответ дан 4 December 2019 в 23:06
поделиться

Я понимаю, что пытается сделать мистер Смит.

Речь идет о 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";
1
ответ дан 4 December 2019 в 23:06
поделиться

Вы можете сделать это с помощью сопоставления ... с.

В этом случае ваша таблица должна быть таблицей MyISAM, и вы должны создать индекс FULLTEXT, включая обязательные столбцы.

1
ответ дан 4 December 2019 в 23:06
поделиться

Попытайтесь создать представление

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____________'    

где '_' соответствует ровно одному символу.

1
ответ дан 4 December 2019 в 23:06
поделиться

Что вам нужно, так это операция отмены поворота. Microsoft SQL Server поддерживает PIVOT и UNPIVOT как расширения стандартного SQL. Я не знаю какой-либо другой марки СУБД, которая поддерживает встроенные функции поворота / отмены поворота. Конечно, MySQL не поддерживает это.

Вы не можете использовать поиск FULLTEXT в этом случае, потому что, как сказано в документации , :

могут использоваться только полнотекстовые индексы с таблицами MyISAM и может быть создан только для столбцов CHAR, VARCHAR или TEXT.

И это не избавит вас от необходимости указывать столбцы в любом случае, потому что предикат MATCH () требует, чтобы вы перечислили все столбцы в полнотекстовом индексе.

Если вы можете'

0
ответ дан 4 December 2019 в 23:06
поделиться

Как насчет решения проблемы с помощью ПРОСМОТРА?

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
0
ответ дан 4 December 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: