【问题标题】:WHERE query inside an AND statement? PHP/PDO/MySQL在 AND 语句中进行 WHERE 查询? PHP/PDO/MySQL
【发布时间】:2013-06-01 15:29:27
【问题描述】:

我的网站上有 2 个表格,一个 users 表格和一个 user_friendships 表格,每个表格的结构都是这样...

用户

id  |  user_id  |  credits_bank  |  credits_offered

用户友谊

id  |  user_id  |  user_followed_id

当我的用户登录时,他会看到网站上的其他用户列表 - 其他用户列表是那些存储在 users 表中并且在 credits_bank 表中的值大于该值的用户credits_offered 表。

创建好友时,会话用户id存储在user_friendships表中,他关注的其他成员的id也存储在user_friendshipsuser_followed_id列下。

问题是我现在需要一个查询来返回所有移动 credits_bank 而不是 credits_offered 的用户以及尚未在与会话用户相同的记录中的 user_frienships 表中的用户。

我目前正在使用...

SELECT DISTINCT u.*
FROM users u
    LEFT JOIN user_friendships uf ON u.user_id = uf.user_followed_id
WHERE u.user_id <> ? 
    AND u.credits_offered <= credits_bank
    AND uf.user_followed_id IS NULL

更新

我想查看credits_bank 的值大于credits_offered 的用户列表,并且我只想显示它们是否已经存在于我的user_friendships 表中与我的同一行中的记录中会话用户。

用户

id  |  user_id  |  credits_bank  |  credits_offered
___________________________________________________
1        123            10                 2
2        231            6                  3
3        312            6                  5
4        213            2                  1

用户友谊

id  |  user_id  |  user_followed_id
___________________________________________________
1       123                231
2       123                312

结果

如果会话 user_id = 123 那么...

user_id 231 and 312 WOULDN'T show as they are in the user friendships table alongside session user id
user_id 213 WOULD show as they have more credits_bank than credits_offered and arent in    friendships table

如果会话 user_id 为 312,那么他将看到所有结果,因为他与 user_friendships 表中的任何人都不是朋友...

【问题讨论】:

  • 查询试图做什么?
  • 只能有一个where 子句,所以模糊不清你的意思。看起来你想要一个and 子句,但它应该做什么?没人知道。也许您需要在访问where 之前加入另一个表或查询?
  • 要获得最佳答案,请编辑您的问题并为您的表粘贴 CREATE TABLE 语句和一些 INSERT 语句。
  • 感谢@baileys' 我已经更新了我的问题

标签: php mysql pdo


【解决方案1】:

据我所知,您已经很接近了。如果当前用户的用户 ID 被称为 SESS_USER_ID,那么这样的东西应该适合你;

SELECT DISTINCT u.*
FROM users u
LEFT JOIN user_friendships uf 
   ON uf.user_followed_id = u.user_id 
  AND uf.user_id = SESS_USER_ID
WHERE u.credits_offered <= credits_bank
  AND uf.user_followed_id IS NULL
  AND u.user_id <> SESS_USER_ID

(请注意,为了简单起见,SESS_USER_ID 在查询中使用了两次)

An SQLfiddle to test with.

【讨论】:

  • 仍然没有运气@JoachimIsaksson,我已经用一个实际示例更新了我的问题
  • @Liam sqlfiddle.com/#!2/24c31/2,与您的示例数据和用户 ID 123 完全相同的查询。您能指出我错过了什么吗? :)
  • 这有效@Joachim,我现在唯一的问题是它还从用户表返回当前登录的用户:/
  • @Liam 更新了查询和删除当前用户的 SQLfiddle。
【解决方案2】:

试试这个:

SELECT u.id, u.user_id, u.credits_bank, u.credits_offered 
FROM users u 
WHERE u.credits_bank>u.credits_offered
    AND u.user_id = [ENTER LOGGED IN USERS ID HERE] 
    AND u.user_id NOT IN (
        SELECT f.user_ol
        FROM user_friendships f 
    )

如果您有任何问题,请告诉我

编辑 最新SQL:

SELECT u.id, u.user_id, u.credits_bank, u.credits_offered 
FROM users u 
INNER JOIN user_friendships f 
   ON f.user_followed_id = u.user_id 
       AND u.credits_bank > u.credits_offered 
       AND f.user_id != [CURRENT_USER_ID]
       AND u.user_id != [CURRENT_USER_ID]

【讨论】:

  • 谢谢@PhilCross,这只是现在返回我所有的用户
  • 我刚刚创建了一个具有相同结构和 SQL 的测试表,并且似乎工作正常:-/ 您确实希望查看credits_bank 大于 credits_offered 的用户列表谁的user_id 不在friendships 表的user_id 中,对吗?
  • 有点像@philcross,很抱歉,我认为我的问题措辞不正确。第一点是正确的,我想查看 credits_bank 大于 credits_offered 的用户列表,但随后我想查看我的友谊表中当前 user_id 还不是朋友的用户列表。我会更新我的问题...
  • 不是问题@liam 我已经更新了我的答案,我想我快到了!我添加了一个where 条件,你会看到它看起来像[INSERT CURRENT USERS ID HERE],这是你应该使用登录用户ID 的地方。我认为这是对的,如果不是,请告诉我,我再看看
  • 但是没有仍然没有运气@PhilCross,仍然返回我所有的用户:/
猜你喜欢
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 2013-04-21
  • 2013-08-10
相关资源
最近更新 更多