从表中选择数据

时间:2016-06-04 12:50:59

标签: mysql sql

我必须使用SQL表:

表1(Recipes):

Name        Ingredients
----------------------------------
ciorba      apa,sare,piper,branza  
paste       branza,oua,lapte   

表2(用户喜欢的Ingredients):

Name       Ingredients
-------------------------
ionutG     branza  
vasile     oua,lapte  

我想从表1中选择包含表2中一种更受欢迎的成分的配方。

Ex:对于ionutG我想要检索两个食谱,因为有喜欢的成分。对于vasile,我想只检索第二个食谱。

请注意,表格较大且条目数量很多。

以下是我的尝试:

SELECT 
    a.Nume 
FROM
    reteta a 
JOIN 
    ingredientplacut b ON (a.Ingrediente = b.Ingrediente);  

但它只返回了具有与我不想要的完全相同成分的食谱。我想要回复那些含有一种或多种喜欢的食材的食谱。

由于

2 个答案:

答案 0 :(得分:0)

尝试存在 例如

 Select a.name from table 1 where exists (select b.name from table 2 where a.ingredient = b.name); 

请注意,这可能不是正确的语法。因此它返回存在的所有配方将返回true。所以当一种或多种成分相同时。

答案 1 :(得分:0)

如果你坚持像你一样存储数据,可能的解决方案(在T-SQL中测试,问题没有指定SQL风格):

<强>设置

create table Recipes 
(
    RecipeId INT NOT NULL IDENTITY(1, 1) CONSTRAINT PK_Recipes PRIMARY KEY,
    Name NVARCHAR(100),
    Ingredients NVARCHAR(4000)
)
GO

insert into Recipes (Name, Ingredients) VALUES ('ciorba', 'apa,sare,piper,branza'), ('paste', 'branza,oua,lapte')
GO


create table Ingredients
(
    IngredientId INT NOT NULL IDENTITY(1, 1) CONSTRAINT PK_Ingredients PRIMARY KEY,
    Name NVARCHAR(100),
    Ingredients NVARCHAR(4000)
)
GO

insert into Ingredients (Name, Ingredients) VALUES ('ionutG', 'branza'), ('vasile', 'oua,lapte')
GO

- 不记得是什么来源 - 可能是this

CREATE FUNCTION [dbo].[SplitStrings_XML]
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
   RETURN 
   (  
      SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
      FROM 
      ( 
        SELECT x = CONVERT(XML, '<i>' 
          + REPLACE(@List, @Delimiter, '</i><i>') 
          + '</i>').query('.')
      ) AS a CROSS APPLY x.nodes('i') AS y(i)
   );

GO

select * from Recipes
select * from Ingredients
GO

-- split strings and retrieve records where intersection is not null
select distinct I.Name, I.Ingredients, R.Name 
FROM Ingredients I
    CROSS APPLY dbo.SplitStrings_XML(Ingredients, ',') IToken
JOIN Recipes R
    CROSS APPLY dbo.SplitStrings_XML(Ingredients, ',') RToken
        ON RToken.Item = IToken.Item

注意:即可。如前所述,您应该考虑规范化数据:

1)性能 - 字符串操作很昂贵,应该避免使用

2)难以编写查询 - 查找常用项的基本查询使用用户定义的函数

3)应用程序开发不好 - 请考虑客户端还需要应用程序的英文版本。目前,所有商品均为罗马尼亚语。你如何处理这种情况?

4)报告不好 - 请考虑您的结构需要对有关成分使用和其他信息的报告进行大量查询。那些报告会有复杂而混乱的查询,这些查询会很慢

[编辑]对于MySQL,可以使用以下参考来替换上面显示的不支持的功能:

使用显示here的方法拆分字符串。 相关问题和解答herehere