PHP, MySQL, SELECT вопрос - PullRequest
       10

PHP, MySQL, SELECT вопрос

0 голосов
/ 16 мая 2011

Здравствуйте, у меня есть вопрос, который может показаться сложным.Но я постараюсь объяснить это как можно лучше.Это проблема логики.У меня есть таблица базы данных.Эта таблица базы данных (назовем ее таблицей A) содержит несколько строк.Строки состоят из этих строк:

ID (auto increment)
Text
Date 
Time
Type
IDAccount.

Теперь некоторые из этих строк равны.Мне нужно выбрать все строки, которые равны и имеют их в одном результате.

Таким образом, логика кода будет:

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

Тогда «эхо» только ОДИН РАЗ (так что не для любой строки, так как они абсолютно равны): Текст Дата Время.(это будет HTML DIV)

Тогда в этих строках у нас есть несколько других строк, которые имеют РАЗНЫЕ значения.

Type
IDAccount.

PHP должен будет показать для этих строк (Type, 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, чтобы ВЫБРАТЬ все строки, которые равны для строк Text, Date и Time и показать результат 1 в конечном DIV, а затем, как показать неравные значения для всех этих строк (Тип, IDAccount) и покажите их все в одном и том же финальном DIV ".

Любая помощь будет очень признательна !!

Давайте поиграем с ней = D

Ответы [ 3 ]

1 голос
/ 16 мая 2011

Я думаю, что лучший способ сделать это был бы в коде 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 . ' - ';
    }
}
0 голосов
/ 16 мая 2011

Две отдельные проблемы в логике того, что вы предлагаете.

Во-первых, если я правильно понимаю, в вашей таблице есть группы повторяющихся данных. Если это так, вы должны разбить ваши данные, чтобы избежать повторения - как это называется «нормализовать» данные. Примерно так:

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

Однако, если в таблице 2 много строк и, как правило, только одна или две соответствующие строки в таблице 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
0 голосов
/ 16 мая 2011

Вы имеете в виду следующее:

Строка 1:

Text Date Time ( once )

- type ,IDAccount ( multiple ).

Возможно, вы неправильно настроили свои таблицы.

Вы должны использовать 2 таблицы, поэтомуВы не получите дублированные строки.

TABLE 1 :
  id
  text
  time

Table 2
  type
  IDaccount
  linkid

Затем выберите все из таблицы 1 и получите во втором запросе все строки, связанные с таблицей 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...