2012-05-10 40 views
2

我所拥有的是一个mySQL查询,它将选择一些饮料并返回有关饮料的基本信息,以及特定的饮料,以及特定饮品的评分。我有3个表饮料,drinks_ratings,drinks_ing如果这些行中至少有一行有给定的值,则选择具有给定ID的所有行

所以,我的问题是说,我想获得含有伏特加酒,并在一个高球杯中我会运行下面的查询饮料信息...

它的作品,它只是我的问题是,它不返回所有的成分。例如,如果我返回“randomDrinkName1”,它碰巧有伏特加和苏打水......当我得到信息时,它会留下苏打水,因为我说WHERE = VODO,所以我明白为什么会出现这种情况。 ..但是有没有其他类型的WHERE子句可以检查它是否含有“伏特加”,并将其与所有其他可能存在的成分信息一起返回?

我知道我可以在这个查询之前做一个查询,获取从我的drinks_ing表中获得的伏特加的ID。

但是,这似乎可能是一个坏主意......就好像有1000个饮料中含有伏特加,只是为了对带有1000个OR语句的选择进行查询。

我很感兴趣,如果有一种方法,我可以很容易地做到这一切在一个查询。谢谢!

select dIngs.id, 
    dIngs.name, 
    dIngs.descrip, 
    dIngs.type, 
    dIngs.ing, 
    AVG(b.rating) as arating, 
    COUNT(b.id) as tvotes 
from (
    select a.id, 
     a.name, 
     a.descrip, 
     a.type, 
     concat (
      '[', 
      GROUP_CONCAT('{\"ing\":', c.ing, ',\"parts\":', c.parts, '}'), 
      ']' 
      ) ing 
    from drinks a 
    left join drinks_ing c on a.id = c.did 
    where c.ing = "vodka" 
     and a.type = "highball" 
    group by a.id 
    ) dIngs 
left join drinks_ratings b on dIngs.id = b.id 
group by dIngs.id 
order by arating desc, 
    tvotes desc LIMIT 0, 
    50; 

编辑: 说明,我会希望得到的结果是这样的:

  [0] 
       descrip = "the description text will be here" 
       arating = 0 
       id = 4 
       ing = [ {"ing": "vodka", "parts": 4}, {"ing": "soda", "parts": 2}, {"ing": "sprite", "parts": 2} ] 
       name = "awesomeDrink" 
       type = "highball" 
       tvotes = 0 

但什么我其实又回到刚才包括伏特加ING,因为这就是我被检查

  [0] 
       descrip = "the description text will be here" 
       arating = 0 
       id = 4 
       ing = [ {"ing": "vodka", "parts": 4} ] 
       name = "awesomeDrink" 
       type = "highball" 
       tvotes = 0 

需要明确的是,如果我不提供类似where ing = vodka,我把所有材料都回来就好了。这不是问题....

我需要它来检查是否有一种潜在的成分恰好是伏特加,然后基本上返回所有的数据...如果伏特加不是一个潜在的成分,忽略喝,不返回它。

编辑: 什么我的表看起来像..

drinks_ing 
--------------- 
did (which is the drink id its associated with) 
id (the id of the ingredient aka "vodka") 
parts 

drinks 
--------------- 
id 
name 
description 
type 
timestamp 

drinks_ratings 
----------------- 
id 
userid 
rating 
timestamp 
+0

请发布一些示例数据来处理。 – vyegorov

+3

为什么......为什么你在SQL中构建JSON,而不是用'json_encode()'在PHP中做这件事? – ThiefMaster

+0

你可以发表你的表创建语句为3表和一些示例数据? – Ray

回答

2

您的最佳方法可能是使用自连接。这是两次引用同一个表的位置,但是名称不同。这大概会是这样的:

SELECT  d.stuff 
FROM  drinks d 
INNER JOIN drinks v on d.id = v.id 
WHERE  v.ingredient = "vodka" 

更新:使这更好的对应于问题的表。这是说:给所有的伏特加成分,找到与伏特加酒相同饮料中的所有成分。

SELECT  d.* 
FROM  drinks_ing d 
INNER JOIN drinks_ing v on d.did = v.did 
WHERE  v.ing = "vodka" 
+0

即时通讯不知道这是否与如何获得收视率兼容,以及我需要如何将所有成分作为JSON字符串返回 – brybam

+0

我认为您应该首先关注收集感兴趣的数据,只有当您拥有向下查询的方面,然后担心格式化为JSON。你应该对你的问题采取分而治之的方法;一次解决一件事。 –

+0

是的,我正在简化你的表格结构;我这样做是为了向你清楚自我连接的工作原理。你将需要适应这种技术来处理更精细的表格结构。你知道自我加入是什么,为什么它与你的问题有关吗? –

1

是的,你可以做一个查询。您的旅馆

SELECT a.id, a.name, a.descrip, a.type, CONCAT('[', GROUP_CONCAT('{\"ing\":', c.ing, ',\"parts\":', c.parts, '}'), ']') ing 
FROM drinks a LEFT JOIN drinks_ing c 
    ON a.id = c.did 
WHERE a.id in (select distinct a.id 
       from drinks_ing c 
        ON a.id = c.did 
       where c.ing = "vodka" 
       ) 

这发现饮料与你想要的成分,并返回有关饮料的信息。

+0

更详细地解释:子查询获取所有含有伏特加作为成分的饮料的ID,外部查询选择所有饮料的成分。 – octern

+0

对不起,这个方法与我所需要的一切不兼容。例如获取所有成分,以及获得平均评分并将其与该特定行相关联。我从来没有听说过'distinct',所以我试图在我的子查询中的select之后在上面发布的同一个查询中简单包含它,但它不起作用。它只返回我搜索的成分。我的整体问题是否有意义?也许我可以试着重新说一遍。对不起,它有点复杂的解释。 – brybam

相关问题