Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
三个表上的Mysql查询,其中第三个表有多个查询返回_Mysql_Sql_Join - Fatal编程技术网

三个表上的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_data
val2
其中(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)