1

我似乎无法让 substring_index() 工作:

我创建了一个简单的表,如下所示:

CREATE TABLE ContactList(
cont_id int(11) NOT NULL AUTO_INCREMENT,
last_name varchar(30),
first_name varchar(20),
interests varchar(100),
PRIMARY KEY(cont_id));

然后我填充了 ContactList 表,如下所示:

INSERT INTO ContactList (last_name, first_name, interests)
VALUES 
('Murphy', 'Dave', 'Golf, Pets, Basketball'),
('Murphy', 'Ben', 'Pets, Gym, Basketball'),
('Finn', 'Belinda', 'Pets, Tennis, Knitting'),
('Murphy', 'Steve', 'Pets, Archery, Fishing');

我运行了一个快速 SELECT 以确保正确输入数据:

SELECT * FROM ContactList;

然后我运行了以下查询:

SELECT * FROM ContactList
WHERE last_name = 'Murphy'
AND SUBSTRING_INDEX(interests, ',' ,1) = 'Pets';

我原以为会拿回两条记录(我为 Ben & Steve 做过),但是,对于“兴趣”列,我假设如果它等于“宠物”(由于 substring_index),我应该只拿回一个兴趣,但是,我收回了所有的兴趣。如何使用 SUBSTRING_INDEX() 运行查询,并且如果显示为“宠物”,则仅获取每条记录的第一个兴趣列表?

顺便说一句,我使用的是 MySQL 5.5.24 版,我知道兴趣最适合他们自己的表 - 我只想看看为什么 substring_index 不从列表中选择第一个项目,如果它等于“宠物”。

感谢您的任何意见,

安迪·R ;-)

4

2 回答 2

3

您在子句中使用SUBSTRING_INDEX,该WHERE子句确定要包含的。这很好,但您还需要在子句中使用它,该SELECT子句确定要包含哪些

试试这个:

SELECT
  last_name,
  first_name,
  SUBSTRING_INDEX(interests, ',' ,1) AS FirstInterestInList
FROM ContactList
WHERE last_name = 'Murphy'
AND SUBSTRING_INDEX(interests, ',' ,1) = 'Pets';
于 2013-06-17T19:29:05.827 回答
1

虽然substring_index()适用于第一个元素,但您确实想要find_in_list()

SELECT last_name, first_name, SUBSTRING_INDEX(interests, ',' ,1) AS FirstInterestInList
FROM ContactList
WHERE last_name = 'Murphy' and
      find_in_set('pets', interests) = 1

的优点find_inset()是它适用于任意位置。

不过,请注意,您的分隔符是', '. 为了find_in_set()获得最佳效果,列后不应有空格。

此外,如果您正在执行这样的查询,您应该修复您的数据结构。它确实需要一个名为类似的表ContactInterests,其中包含每个联系人和每个兴趣的一行。

于 2013-06-17T20:32:14.013 回答