如何避免在循环内运行MySQL查询?

时间:2011-02-25 16:25:12

标签: mysql

我有一组两张桌子。一个message_table,其id,language_id,message_id,message和语言表设置为id,language。

我需要1)显示结果,显示哪些消息已从语言1翻译成语言2和2)还显示语言1中的哪些消息尚未翻译。尚待翻译的消息不在messages_table中。

让步骤1变得简单:

SELECT message_table.message AS start, end.message AS end FROM message_table LEFT JOIN message_table AS end ON (end.message_id = message_table.message_id message_table.id != end.id AND message_table.language_id = '$start' AND end.language_id='$end'

但我需要它来返回尚未翻译的消息的结果。

基本上,我需要通过在另一个mysql查询中循环一个mysql查询来实现以下目的:

$items = $this->query("SELECT message_id, message FROM message_table WHERE language_id = '$start'");

        foreach($items as $result) {

            $message_id = $result['message_id'];

            $returns = $this->query("SELECT * FROM message_table WHERE language_id = '$end' AND message_id = '$message_id'");

            if(!empty($returns)) {

                foreach($returns as $return) {

                    echo "English: " . $result['message'] . "<br>";
                    echo $return['message'] . '<br><br>';

                }

            } else {

                echo "English: " . $result['message'];
                echo "<br>none<br><br>";


            }


        }

1 个答案:

答案 0 :(得分:1)

将表连接到自身以查找相关消息。

SELECT
    m1.message as EnglishMessage, m2.message as TranslatedMessage
FROM
    message_table m1
LEFT JOIN
    message_table m2 on m1.message_id = m2.message_id
WHERE
    m1.language = '$start' and m2.language = '$end'

如果TranslateMessage不是NULL,则显示已翻译的邮件。否则,没有可用的翻译:

foreach ($items as $result) {

    $EnglishMessage = $result['EnglishMessage'];
    $TranslatedMessage = $result['TranslatedMessage'];

    if ($TranslatedMessage) {   // not sure about this!

        echo 'English: '. $EnglishMessage. '<br />';
        echo $TranslatedMessage. '<br /><br />';

    } else {

        echo 'English: '. $EnglishMessage;
        echo '<br />none<br /><br />';

    }

}