【问题标题】:How to select all meta values of certain meta_key's?如何选择某些元键的所有元值?
【发布时间】:2015-11-02 14:30:37
【问题描述】:

我正在尝试进行查询,但我无法掌握它。我想通过某些 meta_keys 选择所有记录。当我通过一个元键查询时它工作正常。但是当我想通过两个 meta_key 进行查询时,它什么也没有返回。有人可以帮帮我吗?!

有效的查询:

SELECT *
FROM `uszc_users` AS u, `uszc_utilizatori_acord` AS ua, `uszc_usermeta` AS ub
WHERE ua.email = u.user_email
AND ub.user_id = u.id
AND ub.meta_key = 'first_name'
AND acord = 'DA'
LIMIT 0 , 30

以及什么都不返回的查询:

SELECT *
FROM `uszc_users` AS u, `uszc_utilizatori_acord` AS ua, `uszc_usermeta` AS ub
WHERE ua.email = u.user_email
AND ub.user_id = u.id
AND ub.meta_key = 'first_name'
AND ub.meta_key = 'last_name'
AND acord = 'DA'
LIMIT 0 , 30

我有 3 个表,表 uszc_usermeta 包含 first_name 和 last_name,它们都在 meta_value 列中。

【问题讨论】:

  • 提供一些原始数据样本和预期结果
  • 天哪,你这里有 3 张桌子?
  • 是的。我有 3 张桌子。为什么?!
  • 你应该使用正确的JOIN 语法和GROUP 以某种方式得到结果

标签: php mysql sql wordpress


【解决方案1】:

你不能有任何记录

AND ub.meta_key = 'first_name'
AND ub.meta_key = 'last_name'

没有意义,就这么简单:

SELECT *
FROM `uszc_users` AS u, `uszc_utilizatori_acord` AS ua, `uszc_usermeta` AS ub
WHERE ua.email = u.user_email
AND ub.user_id = u.id
AND (ub.meta_key = 'first_name'
OR ub.meta_key = 'last_name')
AND acord = 'DA'
LIMIT 0 , 30

UPDATE 由于 OP 说 @bhelmet 发布了正确答案,我想为 OP 澄清 good 查询应该如何看起来像恕我直言:

SELECT u.*, ub.meta_value first_name, uc.meta_value last_name
FROM `uszc_users` AS u  
INNER JOIN `uszc_utilizatori_acord` AS ua
ON ua.email = u.user_email
  AND ua.acord = 'DA'
INNER JOIN  `uszc_usermeta` AS ub
ON ub.user_id = u.id
  AND ub.meta_key = 'first_name'
INNER JOIN `uszc_usermeta` AS uc
ON uc.user_id = u.id
  AND uc.meta_key = 'last_name'
LIMIT 0 , 30

【讨论】:

  • 使用@bhelmet 解决方案后,我遇到了一些问题。如果 meta_value 列在表中出现两次,我将如何选择记录? meta_key 的 meta_values: 'first_name' 和 'last_name' 现在位于两个不同的 meta_value 列中。
  • 你还有很多问题,只是你还不知道 :-)
  • 你能帮帮我吗?!您更新后的查询会引发错误。
  • 你检查最后一个了吗?有一些错别字,但我相信我确实修正了它们。你有什么错误?
  • 现在可以了。谢啦。我会接受这个答案作为解决方案。非常感谢。
【解决方案2】:

您要求提供meta_key 等于“first_name”和“last_name”的所有记录。你可能想做AND ub.meta_key IN ('first_name', 'last_name')之类的事情。

SELECT *
FROM `uszc_users` AS u, `uszc_utilizatori_acord` AS ua, `uszc_usermeta` AS ub
WHERE ua.email = u.user_email
AND ub.user_id = u.id
AND ub.meta_key IN ('first_name', 'last_name')
AND acord = 'DA'
LIMIT 0 , 30

【讨论】:

  • 首先返回所有带有 meta_key 'first_name' 的记录,然后返回所有带有 meta_key 'last_name' 的记录。我想在同一排。这可能吗?
  • 编辑您的问题以添加更多详细信息,尤其是您所需输出的示例。表结构的简短示例也会很有用。
  • 我希望 meta_value 列上的名字和姓氏同时具有。
【解决方案3】:

要检查“usermeta”的两个条件,您应该加入表两次。你需要这样的东西:

SELECT *
FROM `uszc_users` AS u, `uszc_utilizatori_acord` AS ua, `uszc_usermeta` AS ub, `uszc_usermeta` AS uc
WHERE ua.email = u.user_email
AND ub.user_id = u.id
AND ub.meta_key = 'first_name'
AND uc.user_id = u.id
AND uc.meta_key = 'last_name'
AND acord = 'DA'
LIMIT 0 , 30

【讨论】:

  • 哦,伙计,这最适合我的需要。太感谢了。但是如果我需要选择某些列怎么办?!因为现在我收到此错误“#1052 - 字段列表中的列 'meta_value' 不明确”
  • 我认为这是因为使用此查询后的列名相同。如果 meta_value 列在表中出现两次,我将如何选择记录? meta_key 的 meta_values: 'first_name' 和 'last_name' 现在位于两个不同的 meta_value 列中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
相关资源
最近更新 更多