查询列中的第一个结果 - substring_index函数 - MySQL

时间:2013-06-17 19:14:41

标签: mysql

我似乎无法使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()来运行查询,只有当每个记录显示“Pets”时才会获得第一个列出的兴趣?

BTW我正在使用MySQL版本5.5.24,我知道兴趣最适合他们自己的表 - 我只是想知道为什么substring_index没有从列表中选择第一项,如果它等于'宠物'。< / p>

感谢您提供任何意见,

安迪R; - )

2 个答案:

答案 0 :(得分: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';

答案 1 :(得分: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的表,每个联系人和每个兴趣都包含一行。