0
SELECT produkte_eintraege.id, produkte_eintraege.hersteller, produkte_eintraege.titel, produkte_eintraege.img_url 
  FROM produkte_eintraege JOIN produkte_eigenschaften 
    ON produkte_eintraege.id = produkte_eigenschaften.produkte_eintraege_id 
 WHERE (produkte_eigenschaften.eigenschaften_merkmale_id = 1 
    OR produkte_eigenschaften.eigenschaften_merkmale_id = 2) 
   AND (produkte_eigenschaften.eigenschaften_merkmale_id = 3) 
 ORDER by hits DESC

结果 = 空

SELECT produkte_eintraege.id, produkte_eintraege.hersteller, produkte_eintraege.titel, produkte_eintraege.img_url 
  FROM produkte_eintraege JOIN produkte_eigenschaften 
    ON produkte_eintraege.id = produkte_eigenschaften.produkte_eintraege_id 
 WHERE (produkte_eigenschaften.eigenschaften_merkmale_id = 1 
    OR produkte_eigenschaften.eigenschaften_merkmale_id = 2) 
 ORDER by hits DESC

结果=工作

这部分有什么问题?:

AND (produkte_eigenschaften.eigenschaften_merkmale_id = 3)

这是表格:

INSERT INTO `produkte_eigenschaften` (`produkte_eintraege_id`, `eigenschaften_merkmale_id`)
VALUES (1, 2), (7, 1), (1, 3);

这意味着一个产品在此表中有多个条目。

4

3 回答 3

1

在您的查询中,您有

WHERE (produkte_eigenschaften.eigenschaften_merkmale_id = 1 OR produkte_eigenschaften.eigenschaften_merkmale_id = 2) 
AND (produkte_eigenschaften.eigenschaften_merkmale_id = 3) ORDER by hits DESC

解释您所说的查询

SELECT * 
FROM a join b 
WHERE (a.id=1 OR a.id=2) AND (a.ID=3)

一个值不能同时等于 2 和 3。

解决方案:有两种解决方案可以解决您的问题:

SELECT pe.id, pe.hersteller, pe.titel, pe.img_url 
FROM produkte_eintraege pe JOIN produkte_eigenschaften pe2 ON pe.id = pe2.produkte_eintraege_id 
WHERE (pe2.eigenschaften_merkmale_id = 1 
  OR pe2.eigenschaften_merkmale_id = 2 
  OR pe2.eigenschaften_merkmale_id = 3) ORDER by hits DESC

或者你可以使用IN

SELECT pe.id, pe.hersteller, pe.titel, pe.img_url FROM produkte_eintraege pe JOIN produkte_eigenschaften pe2 ON pe.id = pe2.produkte_eintraege_id 
WHERE pe2.eigenschaften_merkmale_id IN (1,2,3) ORDER by hits DESC

我希望这会有所帮助。

于 2013-10-26T12:45:54.840 回答
0

无论您输入什么数据,您都不会有 Merkmale_id 为 2 和 3 的产品。您的意思是 OR 而不是 AND?

于 2013-10-26T12:38:51.167 回答
0

考虑到您对沃尔特的回答的评论,您应该首先将其放在您的问题中,为了实现您的目标,您必须使用GROUP BY产品 ID 并将您的条件放在HAVING子句中

SELECT produkte_eintraege_id 
  FROM produkte_eigenschaften
-- WHERE eigenschaften_merkmale_id IN(1, 2, 3)
 GROUP BY produkte_eintraege_id
HAVING MAX(eigenschaften_merkmale_id IN (1, 2)) = 1
   AND MAX(eigenschaften_merkmale_id = 3) = 1

这是SQLFiddle演示

然后你可以JOIN回到produkte_eintraege

SELECT e.id, e.hersteller, e.titel, e.img_url
  FROM
(
    SELECT produkte_eintraege_id 
      FROM produkte_eigenschaften
    -- WHERE eigenschaften_merkmale_id IN(1, 2, 3)
     GROUP BY produkte_eintraege_id
    HAVING MAX(eigenschaften_merkmale_id IN (1, 2)) = 1
       AND MAX(eigenschaften_merkmale_id = 3) = 1
) q JOIN produkte_eintraege e
    ON q.produkte_eintraege_id = e.id
  ORDER BY hits DESC
于 2013-10-26T12:52:46.783 回答