【问题标题】:PHP, MySQL, SELECT questionPHP、MySQL、SELECT 问题
【发布时间】:2011-05-16 10:52:07
【问题描述】:

您好,我有一个看起来很复杂的问题。但我会尽力解释得更好。这是一个逻辑问题。 我有一个数据库表。这个数据库表(我们称之为表 A)包含一些字符串。 字符串由这些行组成:

ID (auto increment)
Text
Date 
Time
Type
IDAccount.

现在其中一些字符串是相等的。我需要选择所有相等的字符串并将它们放在一个结果中。

所以代码的逻辑是:

SELECT * from Table A WHERE mySQL find stringS with same Text, Date and Time. 

然后“回显”仅 ONE TIME(所以不是任何字符串,因为它们完全相等):文本日期时间。 (这将是一个 HTML DIV)

然后在这些字符串中,我们还有一些其他具有不同值的行。

Type
IDAccount.

PHP 必须为这些行(类型、IDAccount)显示为上述 EQUAL 字符串找到的所有不同值。

所以最终的 DIV 将是:

Text (one time)
Date (one time)
Time (one time)
Type (every different value that is found will be shown)
IDAccount (every different value that is found will be shown).

我知道这很难理解。我希望有人明白我的意思。 最重要的是“如何对 mySQL 说 SELECT 所有与行 Text 、 Date 和 Time 相等的字符串并在最终 DIV 中显示 1 结果,然后如何显示所有这些字符串的不相等值(类型, IDAccount) 并将它们全部显示在同一个最终 DIV"中。

任何帮助将不胜感激!

让我们一起玩吧=D

【问题讨论】:

  • 12 个问题,但仍未格式化代码/查询。
  • 这不是代码 Harry Joy。那是一个逻辑代码。一种解释代码应该做什么的方法。那里没有任何关于代码的内容。老实说,我仍然不明白如何在这个网站上格式化。对此感到抱歉
  • 在编写 SQL 或代码时,请通过选择文本并在编辑器中按 {} 按钮将其包装在代码块中。或者,您可以将 SQL/代码包装在反引号 (`) 中
  • 编辑您的问题,在您的问题右侧,您会找到一个如何格式化框,其中描述了如何在本网站中进行格式化。
  • Sql 查询可以格式化为代码...如果您使用列表、标题、代码跨度,我们会更容易为您提供帮助。 Please read this

标签: php mysql foreach


【解决方案1】:

我认为最好的方法是在 PHP 代码中,而不是在 SQL 中。

您可以通过简单地在 PHP 中创建一个关联数组来实现这一点,使用“文本”字段作为键,其中包含您想要的数据 - 并在您从数据库中提取信息时填充它。

一个例子:

SQL: SELECT * FROM myTable

PHP 代码:

<?php

// Connect to MySQL database
$result = mysql_query($sql_query_noted_above);
$stringsInfo = array();
while ($row = mysql_fetch_assoc($result))
{
    if (!isset($stringsInfo[$row['text']]))
    {
        $stringsInfo[$row['text']] = array('types' => array(), 'idAccounts' => array());
    }

    $stringsInfo[$row['text']]['types'][] = $row['type'];
    $stringsInfo[$row['text']]['idAccounts'][] = $row['idAccount'];
}

?>

这将为您提供如下数组:

'myTextString' => 'types' => 'type1', 'type2', 'type3'
                  'idAccounts' => 'account1', 'account2'

'anotherTextString' => 'types' => 'type2', 'type4'
                       'idAccounts' => 'account2', 'account3'

等等。

我希望这会有所帮助。

编辑:海报寻求展示方面的帮助。

<?php

foreach ($stringsInfo as $string => $info)
{
    echo $string . '<br />';
    echo 'Types: ' . implode(', ', $info['types']); // This will echo each type separated by a comma
    echo '<br />';
    echo 'ID Accounts: ' . implode(', ', $info['idAccounts']);
}

/* 或者,如果需要更多控制,可以循环 $info 中包含的每个数组 */

foreach ($stringsInfo as $string => $info)
{
    echo $string . '<br />';
    echo 'Types: ';
    foreach ($info['types'] as $type)
    {
        echo $type . ' - ';
    }
    echo '<br />';
    echo 'ID Accounts: '
    foreach ($info['idAccounts'] as $idAccount)
    {
        echo $idAccount . ' - ';
    }
}

【讨论】:

  • 我是新手。那么将如何输出文本、日期和时间呢?然后我需要一个 foreach 来显示数组的结果吗? =(((
  • 是的,没错。每个字符串都有一个数组元素,这将包含类型和 id 帐户的数组。我将编辑我的答案以提供显示功能。
  • 当然,下面的@Paolo_NL_FR 是正确的,为了数据效率,应该对数据库模式进行规范化;我的回答假设您不能更改底层架构(或者这样做是不切实际的)
【解决方案2】:

你的意思是:

第 1 行:

Text Date Time ( once )

- type ,IDAccount ( multiple ).

您可能没有正确设置您的桌子。

你应该使用 2 个表,这样你就不会得到重复的行。

TABLE 1 :
  id
  text
  time

Table 2
  type
  IDaccount
  linkid

然后从表 1 中全选,然后对链接到表 2 的每一行进行第二次查询

【讨论】:

    【解决方案3】:

    你提出的逻辑中有两个独立的问题。

    首先,如果我理解正确,您的表格中有重复的数据组。如果是这样,您应该分解数据以避免重复 - 因为它被称为“规范化”数据。像这样的:

    table 1                       table 2 (account?)                
    ================              ================
    ID (primary key)              IDAccount (primary key)
    Text                          Type
    Date
    Time
    IDAccount (ref to table 2)
    

    这样表格就没有重复的数据,也没有相关的错误风险(例如数据应该相同但不是因为拼写错误等)

    其次,您可以使用 PHP 构造来获得您想要的。你怎么做取决于你想要什么,可能还取决于表 1 和 2 中的行数。如果表 2 的行数很少,我会这样做(伪代码):

    $query1 : "select * from table2";
    for (each x = row in $query1)
       display IDAccount and type of x
       $ida = IDAccount of x
       query2 : "select * from table1 where IDAccount=$ida"
       for (each y = row in $query2) display y
    

    但是,如果 table2 中有很多行,而 table 1 中通常只有一两行对应的行,我会这样做:

    $query : "select * from table1 join table2 on table1.IDAccount=table2.IDAccount"
    $old_ida = -1
    for (each x = row in $query)
       $ida = IDAccount of x
       if ($ida is different from $old_ida)
          show idaccount and type of $query
       show id, text, date, time of query
       $oldida = $ida
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 2020-09-30
      • 2011-08-16
      • 1970-01-01
      相关资源
      最近更新 更多