как получить значение из таблицы MySQL, упорядоченной по другой таблице? - PullRequest
1 голос
/ 08 марта 2012

У меня есть ссылка на запись для данной статьи.ссылка может относиться к типу статьи, книги, тезисов и т. д., каждый может иметь разные атрибуты, например,

//article_refs table
ID Article_ID Article_Title Author_Name ...
1  1          title1        author1
2  1          title2        author2

//thesis_refs table
ID Article_ID Thesis_Title Thesis_Publisher ...
1  1          thesis1      publisher1
2  1          thesis2      publisher2

//ref_types table
ID Article_ID ReferenceType
1  1          book
2  1          article
3  1          article
4  1          book

, когда я вставляю его в одну из таблиц, я сначала в таблицу ref_type с ее типом (book, статья).затем вставьте таблицу, к которой она принадлежит.(например, если это статья, вставьте в таблицу статей) ..

Теперь я должен иметь возможность перечислять ссылки в порядке.

$sql=mysql_query("SELECT * FROM ref_types 
WHERE $article_ID=Article_ID ORDER BY ID ASC");
while($row = mysql_fetch_array($sql)){
    $counter=1;

    if($row[2]=="thesis"){
        $sqlthesis=mysql_query("SELECT * FROM thesis_refs
        WHERE $article_ID=Article_ID 
        ORDER BY ID ASC");
        while($thesis_row = mysql_fetch_array($sqlthesis)){
            echo "record $counter: ";
            echo $row[2];
            echo ", ";
            echo $thesis_row[2];
            echo "<BR>";
            $counter++
        }   
    }elseif.....

таким образом он перечисляет все записи тезиса, затем перечисляет таблицу статей и т. Д.

record 1: book1
record 2: book2
record 3: article1
record 4: article2

я знаю, что это просто из-за цикла while, но как это получить (тот же порядок с таблицей ref_types ..) ??

record 1: book1
record 2: article1
record 3: article2
record 4: book2

любая помощь приветствуется.заранее спасибо ..

Ответы [ 2 ]

1 голос
/ 08 марта 2012

В дополнение к наличию столбца ReferenceType в таблице ref_types вам также необходим столбец Reference_ID, который ссылается на фактический идентификатор в соответствующей таблице как внешний ключ .

//ref_types table
ID Article_ID ReferenceType Reference_ID
1  1          book          1
2  1          article       1
3  1          article       2
4  1          book          2

Тогда, вы можете избежать цикла WHILE и позволить MySQL выполнить всю работу за вас с помощью JOIN:

SELECT CONCAT('record ', rt.ID, ': ',
  COALESCE(ar.Article_Title, tr.Thesis_Title, br.Book_Title))
FROM ref_types rt
LEFT JOIN article_refs ar
  ON rt.ReferenceType = 'article' AND ar.ID = rt.Reference_ID
LEFT JOIN book_refs br
  ON rt.ReferenceType = 'book' AND br.ID = rt.Reference_ID
LEFT JOIN thesis_refs tr 
  ON rt.ReferenceType = 'thesis' AND tr.ID = rt.Reference_ID

Возвращает результат:

record 1: book1
record 2: article1
record 3: article2
record 4: book2
0 голосов
/ 08 марта 2012

Вместо того, чтобы печатать данные сразу, сохраните их в массиве на основе идентификатора ref_thesis. * 1001 например *

$data = array();

$sql=mysql_query("SELECT * FROM reftypes 
WHERE $article_ID=Article_ID ORDER BY ID ASC");
while($row = mysql_fetch_array($sql)){
$counter=1;

if($row[2]=="thesis"){
    $sqlthesis=mysql_query("SELECT * FROM ref_thesis 
    WHERE $article_ID=Article_ID 
    ORDER BY ID ASC");
    while($thesis_row = mysql_fetch_array($sqlthesis)){
        $data[ $row['id'] ] = $row;
    }   
}elseif.....

таким образом, строки в массиве $data будут в порядке, основанном на id в таблице ref_thesis.

Тем не менее, я думаю, вы должны вернуться и подумать о вашей схеме БД. Вы должны иметь возможность получить то, что вы хотите, с помощью нескольких простых операторов JOIN в одном запросе, а не запрашивать БД внутри цикла while

...