首页 > 解决方案 > 我必须通过从 SQL 表中检索来过滤记录。我希望 sql 中我的表列中同一字段中的值不再显示

问题描述

我不能这样做,请帮忙。在我在下面编写的代码中,程序 id 1 的 Specialty 中有两个值。那么有没有一种方法可以过滤,以便过滤结果中不再显示该值,即此处指定的免费午餐。在过滤时,当我从数据库中检索时,我得到如下所示的复选框。

免费一餐,免费午餐

b 免费午餐

c 免费晚餐

我想要只显示免费餐点

INSERT INTO `programs` (`ProgramID`, `UserID`,`Speciality`) VALUES
(1, 'huy45', 'Free meal, Free lunch'),
(2, 'ga32','Free lunch'),
(3, 'sharvar3','Free Dinner'),

标签: mysqlsql

解决方案


你的表中有重复的信息,你不想要它。干燥 !.

我会使用另一个表来存储专业,例如:

专业

 id | name
----+-------------
 1  | Free meal
 2  | Free lunch
 3  | Free dinner

因此,您可以轻松地使用外键将此类信息存储在表中programs

接下来,您不想存储序列化信息。这违背了使用 RDBMS 的目的。

我会programs像这样构造表格:

 ProgramID | UserID     | SpecialityID
-----------+------------+--------------
 1         | 'huy45'    | 1
 1         | 'huy45'    | 2
 2         | 'ga32'     | 2
 3         | 'sharvar3' | 3

要检索ProgramID和专业名称UserID,您可以使用以下查询:Speciality'Free meal'

SELECT p.`ProgramID`,
       p.`UserID`,
       s.`name` AS "Speciality Name"
FROM `programs` p
INNER JOIN `Speciality` s
ON p.SpecialityID = s.id
WHERE s.`name` = 'Free lunch';

架构(MySQL v5.7)

CREATE TABLE Speciality (
  `id` INTEGER,
  `name` VARCHAR(11)
);

INSERT INTO Speciality
  (`id`, `name`)
VALUES
  (1, 'Free meal'),
  (2, 'Free lunch'),
  (3, 'Free dinner');



CREATE TABLE programs (
  `ProgramID` INTEGER,
  `UserID` VARCHAR(10),
  `SpecialityID` INTEGER
);

INSERT INTO programs
  (`ProgramID`, `UserID`, `SpecialityID`)
VALUES
  (1, 'huy45', 1),
  (1, 'huy45', 2),
  (2, 'ga32', 2),
  (3, 'sharvar3', 3);

查询 #1

SELECT p.`ProgramID`,
       p.`UserID`,
       s.`name` AS "Speciality Name"
FROM `programs` p
INNER JOIN `Speciality` s
ON p.SpecialityID = s.id
WHERE s.`name` = 'Free lunch';

| ProgramID | UserID | Speciality Name |
| --------- | ------ | --------------- |
| 1         | huy45  | Free lunch      |
| 2         | ga32   | Free lunch      |

在 DB Fiddle 上查看


推荐阅读