Я не могу получить ожидаемый результат как с помощью оператора, где поле хранит множественное целочисленное значение [duplicate]

Использовать LiNQ OrderBy

List objListOrder=new List ();
    objListOrder=GetOrderList().OrderBy(o=>o.orderid).ToList();

67
задан p.campbell 17 February 2011 в 19:36
поделиться

11 ответов

Классическим способом было бы добавить запятые влево и вправо:

select * from shirts where CONCAT(',', colors, ',') like '%,1,%'

Но find_in_set также работает:

select * from shirts where find_in_set('1',colors) <> 0
146
ответ дан Don't Panic 17 August 2018 в 21:42
поделиться
  • 1
    Я попробовал find_in_set, но он возвращает тот же результат независимо от значения цвета, которое я вводил ... Любые предложения? – bikey77 17 February 2011 в 20:19
  • 2
    @ bikey77: Возможно, это проблема, в документации говорится: эта функция работает неправильно, если первый аргумент содержит символ запятой (","). – Andomar 17 February 2011 в 20:27
  • 3
    Моя ошибка, это была логическая ошибка из-за того же значения фиктивных значений. Он работает нормально. Благодаря! – bikey77 17 February 2011 в 20:37
  • 4
    @Andomar Прежде чем я нашел ваш ответ, я боролся с IN, но ваша работа - это шарм ... Большое вам спасибо. – PHP Mentor 19 October 2012 в 21:35
  • 5
    Это влияет на производительность, поскольку Find_in_set не использует индекс – Kamran Shahid 29 May 2015 в 09:15

Все ответы не совсем правильные, попробуйте следующее:

select * from shirts where 1 IN (colors);
-4
ответ дан Backslider 17 August 2018 в 21:42
поделиться

Фактически вы должны исправить свою схему базы данных, чтобы у вас было три таблицы:

shirt: shirt_id, shirt_name
color: color_id, color_name
shirtcolor: shirt_id, color_id

Тогда, если вы хотите найти все рубашки, которые являются красными, вы сделали бы запрос типа:

SELECT *
FROM shirt, color
WHERE color.color_name = 'red'
  AND shirt.shirt_id = shirtcolor.shirt_id
  AND color.color_id = shirtcolor.color_id
3
ответ дан CanSpice 17 August 2018 в 21:42
поделиться
  • 1
    @Blindy: Это верно только в том случае, если вы предполагаете, что OP имеет права прав на схему базы данных; имеет время для реорганизации базы данных, переноса данных и реорганизации всех клиентов; и что уменьшение сложности для этого запроса перевешивает увеличение сложности в остальной части приложения. – Andomar 17 February 2011 в 20:30
  • 2
    @Andomar, затем снова, когда он столкнется с ограничениями размера для поиска строк и его «записей», будут обрезаны, ЭТО, когда начнется настоящая забава! – Blindy 17 February 2011 в 22:11
  • 3
    @Blindy: Вам не хватает смысла; Я не утверждаю, что у него есть лучшее решение, просто не все имеют право переделывать свою среду по своему вкусу – Andomar 17 February 2011 в 22:16
  • 4
    -1 Потому что вы не отвечаете или не разрешаете проблему. – Adam F 18 May 2012 в 23:48
  • 5
    Я согласен с @Andomar – Adam B 10 October 2013 в 00:29
select * from shirts where find_in_set('1',colors) <> 0

Работает для меня

0
ответ дан Deepak Bhatta 17 August 2018 в 21:42
поделиться

Вы можете добиться этого, выполнив следующую функцию.

Запустите следующий запрос для создания функции.

DELIMITER ||
CREATE FUNCTION `TOTAL_OCCURANCE`(`commastring` TEXT, `findme`     VARCHAR(255)) RETURNS int(11)
NO SQL
-- SANI: First param is for comma separated string and 2nd for string to find.
return ROUND (   
    (
        LENGTH(commastring)
        - LENGTH( REPLACE ( commastring, findme, "") ) 
    ) / LENGTH(findme)        
);

И вызовите эту функцию следующим образом:

msyql> select TOTAL_OCCURANCE('A,B,C,A,D,X,B,AB', 'A');

Надеюсь, что это поможет.

0
ответ дан Delickate 17 August 2018 в 21:42
поделиться

Посмотрите на функцию FIND_IN_SET для MySQL.

SELECT * 
    FROM shirts 
    WHERE FIND_IN_SET('1',colors) > 0
21
ответ дан Joe Stefanelli 17 August 2018 в 21:42
поделиться
  • 1
    Остерегайтесь: find in set не использует индексы на таблице. – edigu 25 February 2017 в 14:43

Если вы используете MySQL, существует метод REGEXP, который вы можете использовать ...

http://dev.mysql.com/doc/refman/5.1/en/ regexp.html # operator_regexp

Итак, вы должны использовать:

SELECT * FROM `shirts` WHERE `colors` REGEXP '\b1\b'
3
ответ дан KOGI 17 August 2018 в 21:42
поделиться
  • 1
    Не могу понять этого, хотя я уверен, что это моя вина. Спасибо, мама. – bikey77 17 February 2011 в 20:36

Это будет работать наверняка, и я на самом деле попробовал это:

lwdba@localhost (DB test) :: DROP TABLE IF EXISTS shirts;
Query OK, 0 rows affected (0.08 sec)

lwdba@localhost (DB test) :: CREATE TABLE shirts
    -> (<BR>
    -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> ticketnumber INT,
    -> colors VARCHAR(30)
    -> );<BR>
Query OK, 0 rows affected (0.19 sec)

lwdba@localhost (DB test) :: INSERT INTO shirts (ticketnumber,colors) VALUES
    -> (32423,'1,2,5,12,15'),
    -> (32424,'1,5,12,15,30'),
    -> (32425,'2,5,11,15,28'),
    -> (32426,'1,2,7,12,15'),
    -> (32427,'2,4,8,12,15');
Query OK, 5 rows affected (0.06 sec)
Records: 5  Duplicates: 0  Warnings: 0

lwdba@localhost (DB test) :: SELECT * FROM shirts WHERE LOCATE(CONCAT(',', 1 ,','),CONCAT(',',colors,',')) > 0;
+----+--------------+--------------+
| id | ticketnumber | colors       |
+----+--------------+--------------+
|  1 |        32423 | 1,2,5,12,15  |
|  2 |        32424 | 1,5,12,15,30 |
|  4 |        32426 | 1,2,7,12,15  |
+----+--------------+--------------+
3 rows in set (0.00 sec)

Попробуйте !!!

24
ответ дан Shakti Singh 17 August 2018 в 21:42
поделиться
  • 1
    find_in_set слишком медленный для больших таблиц – Jeff_Alieffson 20 December 2013 в 20:00
  • 2
    Хороший ответ, я решил свою проблему. – Majbah Habib 7 July 2018 в 09:26

Если набор цветов более или менее фиксирован, наиболее эффективным и наиболее читаемым способом будет использование строковых констант в вашем приложении, а затем использование типа SET MySQL [] в ваших запросах. При использовании типа SET с FIND_IN_SET MySQL использует одно целое число для хранения всех значений и использует двоичную "and" операцию для проверки наличия значений, которые являются более эффективными, чем сканирование разделенной запятыми строки .

В SET('red','blue','green'), 'red' будет храниться внутри 1, 'blue' будет храниться внутри, так как 2 и 'green' будут храниться внутри 4. Значение 'red,blue' будет сохранено как 3 (1|2) и 'red,green' как 5 (1|4).

6
ответ дан tremby 17 August 2018 в 21:42
поделиться
24
ответ дан Shakti Singh 6 September 2018 в 13:54
поделиться
25
ответ дан Shakti Singh 29 October 2018 в 20:20
поделиться
Другие вопросы по тегам:

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