mysql – 为什么这个查询总是返回一个空行?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 为什么这个查询总是返回一个空行?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2856字,纯文字阅读大概需要5分钟。
内容图文
我对此查询感到非常疯狂,并想知道是否有一个天才,这对于谁来说这只是一个孩子的游戏……?
此查询应建议随机用户登录用户,而登录用户与建议用户之间的关系不得以下列方式之一阻止:
>各大洲
>按国家/地区
>按年龄范围
>按性别划分
> by id(blocker< - > blockee)
表结构
用户
id | username | country_id_home | timestamp_lastonline | gender | birthdate | allow_gender | age_min | age_max | ...
评论:birthdate是mysql-date格式(YYYY-MM-DD),性别(0 =女性,1 =男性),allow_gender(0 =两者,1 =女性,2 =男性)
国家
country_id | name | continent_id | ...
城市
id | city_real | ...
注释:表用户中的loc_id_home与城市中的id匹配
blocked_countries
id | user_id | country_id | ...
blocked_continents
id | user_id | continent_id | ...
BLOCKED_USER
id | user1_id | user2_id | ...
评论:user1是“blocker”,user2是“blockee”
我到现在的查询是:
SELECT u.id AS user_id, u.username, u.fname, u.country_id_home, u.timestamp_reg, u.timestamp_upd, u.timestamp_lastonline, u.online_status, u.gender, u.birthdate, u.prof_pic,
(SELECT name FROM countries co WHERE co.country_id=u.country_id_home) AS country_name,
(SELECT city_real FROM cities ci WHERE ci.id=u.loc_id_home) AS city ,
(SELECT region_name FROM regions r WHERE r.id=u.region_id_home) AS region,
(SELECT region_short FROM regions r WHERE r.id=u.region_id_home) AS region_short
FROM user_d1 u
LEFT JOIN (
SELECT DISTINCT user2_id AS blockee_id
FROM blocked_user
WHERE user1_id = :user1_id1
)this_user_blocked ON u.id = this_user_blocked.blockee_id
LEFT JOIN (
SELECT DISTINCT user1_id AS blocker_id
FROM blocked_user
WHERE user2_id = :user1_id2
)blocked_this_user ON u.id = blocked_this_user.blocker_id
WHERE
(allow_gender=0 OR allow_gender=:user1_allow_gender)
AND age_min<=:user1_age1
AND age_max>=:user1_age2
AND prof_status<>2
AND this_user_blocked.blockee_id IS NULL AND blocked_this_user.blocker_id IS NULL
AND NOT EXISTS (SELECT 1 FROM blocked_countries bc WHERE bc.user_id=u.id AND bc.country_id =:user1_country)
AND NOT EXISTS (SELECT 1 FROM blocked_countries bc WHERE bc.user_id=:user1_id3 AND bc.country_id = u.country_id_home)
AND EXISTS (
SELECT 1 FROM user_d1 u2
WHERE u2.id=:user1_id4
AND (u2.allow_gender=0 OR u2.allow_gender=(u.gender+1))
AND age_min<=(DATEDIFF(NOW(),u.birthdate))
AND age_max>=(DATEDIFF(NOW(),u.birthdate))
AND prof_status<>2
)
LIMIT 0,6
没有最后的AND EXISTS …结果集不为空,但是像这样它总是不返回任何结果.然而,不包括被大陆阻挡的情况,并且还没有按时间戳排除…
在最后的AND EXISTS中我做错了什么?是否应该加入JOIN?我也试过了,但它也给出了一个空洞的结果……
我已经在SESSION变量中存储了登录用户的所有必要变量…如果您在查询中发现可以更好地完成的任何其他内容,我也非常乐意为您提供帮助!
非常感谢你提前!
解决方法:
我认为这是因为DATEDIFF,它返回两个日期之间的天数而不是年数.因此DATEDIFF可能总是大于age_max.
编辑:你可以做这样的事情:
...
AND DATE_SUB(NOW(), INTERVAL age_max YEAR) <= u.birthdate
AND DATE_SUB(NOW(), INTERVAL age_min YEAR) >= u.birthdate
...
内容总结
以上是互联网集市为您收集整理的mysql – 为什么这个查询总是返回一个空行?全部内容,希望文章能够帮你解决mysql – 为什么这个查询总是返回一个空行?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。