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'为什么不重新表述你的问题,让它问你真正想要回答的问题?