三个表上的Mysql查询,其中第三个表有多个查询返回
我有两个表,列出和列出数据 列表表三个表上的Mysql查询,其中第三个表有多个查询返回,mysql,sql,join,Mysql,Sql,Join,我有两个表,列出和列出数据 列表表 ** listing_id | some_field | some_other_field ** ** 1 | value | value ** ** 2 | value | value ** ** 3 | value | value ** ** 4 | value | val
** listing_id | some_field | some_other_field **
** 1 | value | value **
** 2 | value | value **
** 3 | value | value **
** 4 | value | value **
列表数据
** data_id | listing_id | field_name | field_value **
** 1 | 1 | value | 1 **
** 2 | 1 | other | 3 **
** 3 | 2 | value | 5 **
** 4 | 3 | value | 6 **
** 5 | 3 | other | 7 **
** 6 | 3 | value | 6 **
我需要查询该表,以便从listings和listing_数据表中获取所有字段,以及满足listing数据表上特定条件的值
也就是说,其中listing_data.field_name='value'和listing_data.field_value介于'1'和'3'之间,listing_data.field_name='other'和listing_data.field_value介于'3'和'4'之间
现在我有:
SELECT l . * , d . *
FROM listings l
JOIN listing_data d ON d.listing_id = l.listing_id
WHERE (
d.field_name = 'val1'
AND field_value
BETWEEN 1
AND 1
)
OR (
d.field_name = 'val2'
AND field_value
BETWEEN 3
AND 4
)
这是可行的,但只返回val1、val2字段值。这些只是为了搜索,但我实际上需要所有字段值(即val3、val4等)。此外,搜索需要是,而不是或,因为我只想要匹配所有搜索条件的结果。在此语句中将OR更改为AND将不返回任何结果。我知道这是因为您无法匹配两个不同的字段名(字段名不能等于val1和val2)您将列表的表别名指定为
l
-您需要引用它,而不是原始名称:
SELECT l.*, i.*
FROM listings l, listing_images i
-- ...
我还把你的WHERE子句改成了我认为你想要的东西。按照您的方式,它不会返回任何记录。这修复了未知表的问题,但是当查询应该返回某些内容时,它会返回空结果。我将编辑我的初始帖子,因为事实证明,我不会在这里查询图像,因为如果列表中没有图像,则列表不会包含在结果中。我通过为每个搜索的字段名创建别名来实现它。我相信,从我的研究中,我将不得不通过循环获得内部数据的完整策略,但仍在努力。以下是当前查询选择distinct(listings.listing_id)、listings.*从listings、listing_data
val1
、listing_dataval2
其中(listings.listing_id=val1
和(listings.listing_id=val2
和(val1
)。field_name='val1'和(val1
.field_值介于3和4之间)和(val2
.field_名称='val2'和(val2
.field_值介于1和2之间))为什么你需要一个所有字段名的列表?我看不出数据结构如何与当前查询的结构相匹配,除非你选择不同的名称并将结果连接到其中的每一个…如果这是针对像PHP这样的服务器端脚本,请运行一个单独的查询来获取所有字段名是的,我在发布后意识到了这一点。我将检索字段名ds,我将循环搜索列表。谢谢!我将尝试此操作。我正要评论说,我正在从此查询中删除images表,因为它将跳过没有图像的查询。此外,我需要字段查询为“AND”,因为我只希望结果与这两个语句匹配。我现在可以从列表中选择l.*join LISTING INd.listing_id=l.listing_id上的g_数据d,其中(d.field_名称='baths'和field_值介于1和2之间)或(d.field_名称='beds'和field_值介于3和4之间)按l.listing_id分组,它只返回列表表中的数据。我正在搜索listing_数据标准,但实际需要返回的所有数据在哪里(d.field_name='baths'和field_值介于1和2之间)或(d.field_name='beds'和field_值介于3和4之间)它在技术上是有效的,但只是从数据表返回搜索到的值。尽管我在搜索字段val1和val2的条件,但我需要列表id的所有字段的值,即val3、val4、Val5。我需要对其进行编辑,以便更清楚地说明。我认为我发布的方式没有涵盖任何内容。
select listings.*, listing_images.*
from listings l
inner join listing_images i
on i.listing_id = l.listing_id
inner join listing_data d
on d.listing_id = l.listing_id
where (d.field_name = 'val1'
and field_value between 1 and 2) or
(d.field_name = 'val2' and
field_value between 3 and 4)