如果可能的话(和你似乎正在建造新的东西),也许你应该重新考虑你的表格布局。看起来你有一列中的成分,可能是用逗号分隔的东西。这实际上不能很好地扩展,甚至可以做出简单的查询,比如您想要的复杂和缓慢的查询(在实际搜索术语前面使用所有这些通配符会有效地禁用任何索引使用)。
也许为INGREDIENTS建立一个单独的表格,建议将n:m基数与RECIPES表格的关系。
伪SQL:
CREATE TABLE RECIPES (id int not null, [...more columns...]) PRIMARY KEY id;
CREATE TABLE INGREDIENTS (id int not null, name varchar(30), [...more columns...]) PRIMARY KEY id;
CREATE TABLE RECIPE_INGREDIENTS (recp_id int not null, ingred_id not null);
这样,你可以加入配方和成分:
SELECT RECIPES.id AS recipe, COUNT(INGREDIENTS.id) AS matching_ingredients
FROM RECIPES r JOIN RECIPE_INGREDIENTS ri ON r.ID=ri.recp_id
JOIN INGREDIENTS i ON ri.ingred_id = i.id
WHERE INGREDIENTS.name in ('mayonnaise', 'bacon', 'cheese')
GROUP BY COUNT(INGREDIENTS.id)
通往配方数量的表格及配套原料的数量。这也会从索引中受益。
请注意,我现在手边没有MySQL服务器,所以上面的内容是写在我头上的。也许我的语法错了一点。此外,您可能想要添加外键信息,但这并不是必需的,才能使其运行。
请参阅MySQL手册中的CREATE TABLE
语法。
我相信你已经意识到了这一点,但是你的数据库设计并不理想......规范化可以使它执行得更好,并且使编写这些类型的查询变得更容易。 – 2010-12-03 07:16:19