Php 将所选内容保存在变量中,然后将该变量用于下一次选择

Php 将所选内容保存在变量中,然后将该变量用于下一次选择,php,mysql,sql,Php,Mysql,Sql,我的数据库中有多个表。假设表用户如下所示: Users: |id|name|gender|access|id_ext| |1 | a | m | 1 | 32 | |3 | b | m | 3 | 33 | |4 | c | m | 1 | 34 | |5 | d | f | 1 | 35 | 我想选择id_ext=32的用户,然后使用所选用户字段运行另一个select语句 我可以通过先用一个查询获取用户,然后用用户

我的数据库中有多个表。假设表用户如下所示:

Users:
|id|name|gender|access|id_ext|
|1 |  a |  m   |   1  |  32  | 
|3 |  b |  m   |   3  |  33  | 
|4 |  c |  m   |   1  |  34  | 
|5 |  d |  f   |   1  |  35  |
我想选择id_ext=32的用户,然后使用所选用户字段运行另一个select语句

我可以通过先用一个查询获取用户,然后用用户信息创建另一个查询来解决这个问题,但在同一个查询中必须有这样做的方法吗

这是我现在使用的查询:

SELECT * FROM users NATURAL JOIN
(SELECT id FROM ages WHERE age BETWEEN
(SELECT limit_age_l FROM users WHERE id=17)
AND (SELECT limit_age_h FROM users WHERE id=17)) as a
WHERE NOT id = 17
AND locale = 'en_US'
AND limit_gender = 1
AND visible = 0
AND NOT EXISTS (SELECT view_id FROM matches WHERE user_id = 17 AND view_id = a.id)
LIMIT 1

问题是查询中的值id=17、limit\u gender=1和locale='en\u US'未知。这些是从id为'32'的用户处获取的。

是-假设子Q查询的形式为:

select field1, field2, ...
from Table1
join Table2 on ...
where ...
and Table1.id = N /* previously selected id from users */
然后,将第一个查询用作子查询:

select field1, field2, ...
from Table1
join Table2 on ...
where ...
and Table1.id = (select id from users where id_ext ='32')
/* replace = with IN if more than one id will be returned */
或者作为后续查询的一部分连接到第一个查询的结果:

select field1, field2, ...
from users 
join Table1 on Table1.id = users.id 
join Table2 on ...
where ...
and users.id_ext ='32'
请注意,这两种表单都假定用户尚未加入现有查询中-如果是,只需将users.id_ext='32'条件添加到现有查询中即可

编辑:如果我正确理解了需求,那么所需的查询可以写成:

SELECT u.* 
FROM users u
join ages a on u.id = a.id and 
               u.age between limit_age_l and limit_age_h
join users ul on ul.id = 17 and 
                 ul.id <> u.id and 
                 ul.locale = u.locale and
                 ul.limit_gender = u.limit_gender and
                 ul.visible = u.visible
AND NOT EXISTS (SELECT NULL 
                FROM matches m
                WHERE m.user_id = ul.user_id AND m.view_id = a.id)
LIMIT 1

是-假设您的子Q查询的形式为:

select field1, field2, ...
from Table1
join Table2 on ...
where ...
and Table1.id = N /* previously selected id from users */
然后,将第一个查询用作子查询:

select field1, field2, ...
from Table1
join Table2 on ...
where ...
and Table1.id = (select id from users where id_ext ='32')
/* replace = with IN if more than one id will be returned */
或者作为后续查询的一部分连接到第一个查询的结果:

select field1, field2, ...
from users 
join Table1 on Table1.id = users.id 
join Table2 on ...
where ...
and users.id_ext ='32'
请注意,这两种表单都假定用户尚未加入现有查询中-如果是,只需将users.id_ext='32'条件添加到现有查询中即可

编辑:如果我正确理解了需求,那么所需的查询可以写成:

SELECT u.* 
FROM users u
join ages a on u.id = a.id and 
               u.age between limit_age_l and limit_age_h
join users ul on ul.id = 17 and 
                 ul.id <> u.id and 
                 ul.locale = u.locale and
                 ul.limit_gender = u.limit_gender and
                 ul.visible = u.visible
AND NOT EXISTS (SELECT NULL 
                FROM matches m
                WHERE m.user_id = ul.user_id AND m.view_id = a.id)
LIMIT 1


这与子查询有关。你想干什么?另一张桌子是什么?如果希望从多个表中获得结果集,则需要使用join。请更精确一点。@Richard:为了澄清:您希望用户具有与指定用户相同的区域设置、限制性别和可见值,但id不同,并且没有与指定用户id对应的匹配记录?请使用建议查询更新答案。这与子查询相关。你想干什么?另一张桌子是什么?如果希望从多个表中获得结果集,则需要使用join。请说得更准确些。@Richard:为了澄清:您希望用户与指定用户具有相同的区域设置、限制性别和可见值,但id不同,如果指定的用户id没有相应的匹配记录,则使用建议的查询更新答案。是-它将返回主查询中所有表中的所有列。如果有子查询作为选项,为什么要使用join?对于大型表来说,这将非常昂贵。@Uday Sawant:关于联接和子查询的参考信息,是的-它将返回主查询中所有表中的所有列。如果有子查询作为选项,为什么要使用联接?对于大型表来说,这将非常昂贵。@Uday Sawant:请参考连接和子查询,注意外部查询可以在另一个表上执行。注意外部查询可以在另一个表上执行。我的查询如下所示:查询的开始:::SELECT*FROM users NATURAL JOIN SELECT id FROM ages,其中age介于SELECT从id=17的用户中选择limit_age_l,从id=17的用户中选择limit_age_h作为非id=17且区域设置为'en_US'且limit_gender=1且visible=0且不存在的用户中选择view_id从user_id=17且view_id=a的匹配中选择view_id。id limit 1::查询结束,其中'id=17'和'limit_gender=1'以及'locale'是从''id_ext=32''如何将您建议的加入查询与此相结合=为什么不把and users.id_ext='32'添加到WHERE子句中呢?其实没那么简单,因为我从一开始就不知道性别、语言环境和id值的限制,这些值应该是从有用户的用户处收集的。id\u ext='32'为什么不重新表述您的问题,以便它询问您实际需要回答的问题?我的查询如下:查询的开始:::SELECT*from users NATURAL JOIN SELECT id from ages,其中年龄介于SELECT limit\u age\l from users WHERE id=17和SELECT limit\u age\h之间从id=17且非id=17且区域设置为'en_-US'和limit_-gender=1且visible=0且不存在的用户中,从user_-id=17和view_-id=a的匹配项中选择view_-id。id-limit 1:::查询结束,其中'id=17'和'limit_-gender=1'以及'locale'是从'id_-ext=32'收集的。我如何组合您建议的加入查询用这个=为什么不把and users.id_ext='32'添加到WHERE子句中呢?这并不是那么简单,因为我从一开始就不知道性别、语言环境和id值的限制,这些值应该是从有用户的用户那里收集的。id_ext='32'为什么不重新表述你的问题,让它问你真正想要回答的问题?