PHP MySQL从3个表中选择

PHP MySQL从3个表中选择,mysql,sql,Mysql,Sql,我需要从三个表中选择数据 在php中,这仅仅意味着检查people中的所有ID,然后在其余的表中循环查找数据。一个SQL查询是否可以实现这一点 这就是我所尝试的: SELECT name, age, message, notes FROM people INNER JOIN messages ON people.id = messages.id INNER JOIN notes ON people.id = notes.id WHERE replied = 'y' 通过columnId或na

我需要从三个表中选择数据

在php中,这仅仅意味着检查
people
中的所有ID,然后在其余的表中循环查找数据。一个SQL查询是否可以实现这一点

这就是我所尝试的:

SELECT name, age, message, notes 
FROM people
INNER JOIN messages ON people.id = messages.id
INNER JOIN notes ON people.id = notes.id
WHERE replied = 'y'

通过columnIdname检查列名和表关系。 在这种情况下,您有名称,但名称不能与messages.id或note.id兼容,因此为表人物添加列id或为表消息和注释添加列名称

例如:

SELECT  _id_  , name, age, message, notes 
    FROM people
    INNER JOIN messages ON people.id = _messages.peopleId_
    INNER JOIN notes ON people.id = _notes.peopleId_
WHERE replied = 'y'

再见^。^

通过columnIdname检查列名和表关系。 在这种情况下,您有名称,但名称不能与messages.id或note.id兼容,因此为表人物添加列id或为表消息和注释添加列名称

例如:

SELECT  _id_  , name, age, message, notes 
    FROM people
    INNER JOIN messages ON people.id = _messages.peopleId_
    INNER JOIN notes ON people.id = _notes.peopleId_
WHERE replied = 'y'

再见。^

我认为您的数据结构有问题。首先,每个表都应该有自己的ID列(主键-了解一下)

第二件事是,对于您的数据结构,如果您有两个以上的用户,那么谁发送消息,谁接收消息都会有问题。您在消息表中有“回复”列(y/n),但此表结构无法将一条消息与您(或某人)回复的消息连接起来。 此外,不需要表注释(我不需要表注释函数),这种数据结构中的表没有太多意义,您只需在表消息中添加一个名为notes的列,这将为您完成工作

以下是一个简单的示例,说明了数据的外观:

表:人

+---------+----------+------------+
|peopleID |  Name    |    Age     |
+---------+----------+------------+
| 123qwe  | Tom      |    23      |
+---------+----------+------------+ 
| 456rty  | Andy     |    35      |
+---------+----------+------------+
表:信息

+---------+----------+------------+-------------------------+------------+
|messageID| peopleID | messages   |          note           | replied    |
+---------+----------+------------+-------------------------+------------+
|   1     | 123qwe   | Hi         | I have problem with this|    0       |
+---------+----------+------------+-------------------------+------------+
|   3     | 123qwe   | Hello      | oh no                   |    0       | 
+---------+----------+------------+-------------------------+------------+   
|   4     | 456rty   | Hi         | yeah                    |    3       | 
+---------+----------+------------+-------------------------+------------+ 
|   5     | 123qwe   | hi         | boring                  |    4       | 
+---------+----------+------------+-------------------------+------------+ 
|   7     | 456rty   | pfff       | what's new              |    0       | 
+---------+----------+------------+-------------------------+------------+   
|   9     | 123qwe   | Hi         | nothing, I'm bored      |    7       | 
+---------+----------+------------+-------------------------+------------+ 
|   10    | 456rty   | pf         | me to                   |    9       | 
+---------+----------+------------+-------------------------+------------+ 
因此,在这里,您将在messageID的列中使用y/n值,而不是在responsed列中使用y/n值,在该列上是该列的答案。此外,如果该列中的值为0,则表示这是对话中的第一条消息

您的查询可用于选择已回答的消息,如下所示

-- SELECT MESSAGE WHICH HAVE BEEN ANSWERED
SELECT m.messageID, p.name, p.age, m.messages, m.note
FROM people p
INNER JOIN message m
ON p.peopleID = m.peopleID
WHERE m.messageID IN (SELECT replied
                      FROM message
                      GROUP BY replied);

-- SELECT MESSAGE WHICH    NOT   HAVE BEEN ANSWERED
SELECT m.messageID, p.name, p.age, m.messages, m.note
FROM people p
INNER JOIN message m
ON p.peopleID = m.peopleID
WHERE m.messageID NOT IN (SELECT replied
                          FROM message
                          GROUP BY replied);
所以你可以看到它是如何工作的

这项工作是这样的,若你们想看到你们得到答案的消息,而不是简单地检查回复列中是否有messageID,回复列中是否有messageID,这意味着消息得到了答案,若并没有,这意味着消息并没有得到答案

希望这不会让你很困惑

德国劳埃德船级社


另外,如果您出于某种原因需要第三个表注释,您可以简单地将其添加到查询中,再添加一个内部联接,就像您在查询中所做的那样

我认为您的数据结构有问题。首先,每个表都应该有自己的ID列(主键-了解一下)

第二件事是,对于您的数据结构,如果您有两个以上的用户,那么谁发送消息,谁接收消息都会有问题。您在消息表中有“回复”列(y/n),但此表结构无法将一条消息与您(或某人)回复的消息连接起来。 此外,不需要表注释(我不需要表注释函数),这种数据结构中的表没有太多意义,您只需在表消息中添加一个名为notes的列,这将为您完成工作

以下是一个简单的示例,说明了数据的外观:

表:人

+---------+----------+------------+
|peopleID |  Name    |    Age     |
+---------+----------+------------+
| 123qwe  | Tom      |    23      |
+---------+----------+------------+ 
| 456rty  | Andy     |    35      |
+---------+----------+------------+
表:信息

+---------+----------+------------+-------------------------+------------+
|messageID| peopleID | messages   |          note           | replied    |
+---------+----------+------------+-------------------------+------------+
|   1     | 123qwe   | Hi         | I have problem with this|    0       |
+---------+----------+------------+-------------------------+------------+
|   3     | 123qwe   | Hello      | oh no                   |    0       | 
+---------+----------+------------+-------------------------+------------+   
|   4     | 456rty   | Hi         | yeah                    |    3       | 
+---------+----------+------------+-------------------------+------------+ 
|   5     | 123qwe   | hi         | boring                  |    4       | 
+---------+----------+------------+-------------------------+------------+ 
|   7     | 456rty   | pfff       | what's new              |    0       | 
+---------+----------+------------+-------------------------+------------+   
|   9     | 123qwe   | Hi         | nothing, I'm bored      |    7       | 
+---------+----------+------------+-------------------------+------------+ 
|   10    | 456rty   | pf         | me to                   |    9       | 
+---------+----------+------------+-------------------------+------------+ 
因此,在这里,您将在messageID的列中使用y/n值,而不是在responsed列中使用y/n值,在该列上是该列的答案。此外,如果该列中的值为0,则表示这是对话中的第一条消息

您的查询可用于选择已回答的消息,如下所示

-- SELECT MESSAGE WHICH HAVE BEEN ANSWERED
SELECT m.messageID, p.name, p.age, m.messages, m.note
FROM people p
INNER JOIN message m
ON p.peopleID = m.peopleID
WHERE m.messageID IN (SELECT replied
                      FROM message
                      GROUP BY replied);

-- SELECT MESSAGE WHICH    NOT   HAVE BEEN ANSWERED
SELECT m.messageID, p.name, p.age, m.messages, m.note
FROM people p
INNER JOIN message m
ON p.peopleID = m.peopleID
WHERE m.messageID NOT IN (SELECT replied
                          FROM message
                          GROUP BY replied);
所以你可以看到它是如何工作的

这项工作是这样的,若你们想看到你们得到答案的消息,而不是简单地检查回复列中是否有messageID,回复列中是否有messageID,这意味着消息得到了答案,若并没有,这意味着消息并没有得到答案

希望这不会让你很困惑

德国劳埃德船级社


另外,如果您出于某种原因需要第三个表注释,您可以简单地将其添加到查询中,再添加一个内部联接,就像您在查询中所做的那样

请包括您的表格结构,特别是这些表格之间的关系。您在
people.id
上同时加入
messages.id
notes.id
很可能是不正确的。对不起,我是DB初学者。我在学习,那里没有任何关系。如果你的桌子之间没有任何关系,那么你要求做的事情是不可能的。您需要在messages表中添加一些与人相关的列(例如:PeopleId),并在
加入
(例如:
加入关于人的消息。id=messages.PeopleId
)中使用该字段。notes表的情况也一样。您需要定义一个关系,以便
连接
表。在php中如何循环使用它来提取数据?当您从People表中提取ID时,该ID如何用于从messages和notes表中提取数据?也许您应该尝试
LEFT JOIN
而不是
JOIN
?(将
respond='y'
移动到
ON
子句以获得正确的左连接行为。)请包括您的表结构,特别是这些表之间的关系。您在
people.id
上同时加入
messages.id
notes.id
很可能是不正确的。对不起,我是DB初学者。我在学习,那里没有任何关系。如果你的桌子之间没有任何关系,那么你要求做的事情是不可能的。您需要在messages表中添加一些与人相关的列(例如:PeopleId),并在
加入
中使用该字段(例如:
加入关于人的消息。id=messages.PeopleId