Mysql 我不明白为什么这个查询不起作用

Mysql 我不明白为什么这个查询不起作用,mysql,Mysql,我有一个非常经典的多对多关系。如下所示:表组: 一个表组_valeur: 还有一张桌子: 我把三行分为三组:一行是英文的prenom=name,一行是男性的,一行是女性的 我有所有的法语名字来表示男性和女性。对于每个名字,我在groupe和valeur之间建立了两个链接:一个是prenom值,另一个是阳性或阴性。 让我们试试埃里卡: 这看起来不错。现在我想选择一个随机值 SELECT val FROM valeur v JOIN groupe_valeur gv ON v.id=gv.valeu

我有一个非常经典的多对多关系。如下所示:表组:

一个表组_valeur:

还有一张桌子:

我把三行分为三组:一行是英文的prenom=name,一行是男性的,一行是女性的

我有所有的法语名字来表示男性和女性。对于每个名字,我在groupe和valeur之间建立了两个链接:一个是prenom值,另一个是阳性或阴性。 让我们试试埃里卡:

这看起来不错。现在我想选择一个随机值

SELECT val
FROM valeur v
JOIN groupe_valeur gv ON v.id=gv.valeur_id
WHERE gv.groupe_id IN (
    SELECT id FROM groupe WHERE val IN ('prenom', 'masculin')
)
ORDER BY RAND() LIMIT 30;

+------------+
| val        |
+------------+
| Ziad       |
| Rosanna    |
| Vincent    |
| Soraya     |
| Gabriela   |
| Florent    |
+------------+

这不管用,给了我男性和女性的名字!我做错了什么?

如果我正确理解您的问题,这就是您的问题:

SELECT id FROM groupe WHERE val IN ('prenom', 'masculin')
IN运算符将接受阳性或prenom的组值,并且所有值都是prénoms,因此,此子查询将返回所有的名字!我建议您在数据库上单独执行该查询并检查结果

 SELECT id FROM groupe WHERE val = 'masculin'
应该有效,或者更好的是,重新编写您的查询:

SELECT val
FROM valeur v
JOIN groupe_valeur gv ON v.id=gv.valeur_id
JOIN groupe g ON gv.groupe_id = g.id
WHERE g.val = 'masculin'
ORDER BY RAND() LIMIT 30;
如果您打算添加新的组nom(例如,姓氏),请按以下方式进行:

SELECT val
FROM valeur v
JOIN groupe_valeur gv ON v.id=gv.valeur_id
JOIN groupe g1 ON gv.groupe_id = g.id
JOIN groupe g2 ON gv.groupe_id = g.id
WHERE g1.val = 'masculin'
AND g2.val = 'prenom'
ORDER BY RAND() LIMIT 30;

可能是这样的:首先随机挑选30只雄性,然后再得到雄性的名字:

SELECT v.val 
FROM valeur v
JOIN (
   SELECT gv.valeur_id
   FROM groupe_valeur gv 
   JOIN groupe g ON g.id = gv.groupe_id  and g.val = 'masculin '
   ORDER BY RAND() LIMIT 30
) as der ON der.valeur_id = v.id
JOIN groupe_valeur gv2 ON gv2.valeur_id = v.id 
JOIN groupe g2 ON g2.id = gv2.groupe_id and g2.val='prenom'

丹的回答让我走上了正确的轨道——尽管他的回答不正确——请看我的评论。以下是我可以在Php中的foreach循环中使用的工作解决方案,它可以添加任意多个组值,这些值的作用类似于我想要的过滤器:

SELECT v.val
FROM valeur v
JOIN (
   SELECT gv.valeur_id
   FROM groupe_valeur gv
   JOIN groupe g ON g.id = gv.groupe_id  and g.val = 'feminin'
) as g0 ON g0.valeur_id = v.id
JOIN (
   SELECT gv.valeur_id
   FROM groupe_valeur gv
   JOIN groupe g ON g.id = gv.groupe_id  and g.val = 'prenom'
) as g1 ON g1.valeur_id = v.id
ORDER BY RAND() LIMIT 50;

你需要做两个连接才能得到prenom和Mangin。您的查询设置方式或获取方式。您所说的随机值是什么意思!是随机值吗!?正如我看到的,你正在做限制30和你在哪里是为两个群体,因此,你将继续得到男性和女性群体!!只需从IN列表中删除prenom。您对这些表的描述以及它们之间的相关性有一定的意义,但是,缺少数据。我建议编辑您的问题并显示每个表中的样本数据,以及如何为一个人建立多个值,例如您的姓名和性别以及其他任何值。您的第一个查询只会一遍遍地返回阳性。我已尝试从valeur v JOIN groupe_valeur gv ON v.id=gv.valeur_id LEFT JOIN groupe g0 ON中选择v.valg0.id=gv.groupe_id和g0.id=从组中选择id,其中val='feminin'按RAND LIMIT排序20;知道valeur表有8 000 000多行,并且我在问题中的查询需要0.07秒才能执行其他尝试:从valeur v JOIN groupe_valeur gv ON v.id=gv.valeur_id LEFT JOIN groupe g0 ON g0.id=gv.groupe_id LEFT JOIN groupe g1 ON g1.id=gv.groupe_id WHERE g0.id=SELECT id FROM groupe WHEREval='feminin'和g1.id=从组中选择id,其中val='prenom'按兰德限额订购20;空集0.00秒我尝试了另一种方法,这也给了我空集:从g0上的groupe\u valeur gv JOIN groupe g0中选择v.val。id=gv.groupe\u id和g0.id=从groupe中选择id,其中val='feminin'在g1上加入groupe g1。id=gv.groupe\u id和g1.id=从groupe中选择id,其中val='prenom'在v上加入valeur v.id=gv.id=gv.valeur\u id按RAND限制顺序20;我试过你的解决方案,直到它奏效。这是可行的,但我正在努力寻找一个解决方案,它可以增加许多群体价值观,如个人、女性、古典或旧时尚或其他什么,如果我错了,告诉我,但我的猜测是:你说首先随机得到30个男性。假设有些男性不是婚前妇女。让我们说15。比如说,有15只雄性动物和15只prenom。您的查询可能只返回15个prenom。我说得对吗?
 SELECT id FROM groupe WHERE val = 'masculin'
SELECT val
FROM valeur v
JOIN groupe_valeur gv ON v.id=gv.valeur_id
JOIN groupe g ON gv.groupe_id = g.id
WHERE g.val = 'masculin'
ORDER BY RAND() LIMIT 30;
SELECT val
FROM valeur v
JOIN groupe_valeur gv ON v.id=gv.valeur_id
JOIN groupe g1 ON gv.groupe_id = g.id
JOIN groupe g2 ON gv.groupe_id = g.id
WHERE g1.val = 'masculin'
AND g2.val = 'prenom'
ORDER BY RAND() LIMIT 30;
SELECT v.val 
FROM valeur v
JOIN (
   SELECT gv.valeur_id
   FROM groupe_valeur gv 
   JOIN groupe g ON g.id = gv.groupe_id  and g.val = 'masculin '
   ORDER BY RAND() LIMIT 30
) as der ON der.valeur_id = v.id
JOIN groupe_valeur gv2 ON gv2.valeur_id = v.id 
JOIN groupe g2 ON g2.id = gv2.groupe_id and g2.val='prenom'
SELECT v.val
FROM valeur v
JOIN (
   SELECT gv.valeur_id
   FROM groupe_valeur gv
   JOIN groupe g ON g.id = gv.groupe_id  and g.val = 'feminin'
) as g0 ON g0.valeur_id = v.id
JOIN (
   SELECT gv.valeur_id
   FROM groupe_valeur gv
   JOIN groupe g ON g.id = gv.groupe_id  and g.val = 'prenom'
) as g1 ON g1.valeur_id = v.id
ORDER BY RAND() LIMIT 50;