2015-05-18 2 views
0

В настоящее время я работаю на панели сообщений, которая отображает только данные, если установлены значения в другой таблице.Выберите данные mySQL с помощью другой таблицы

Мои 2 таблицы выглядит следующим образом:

tbsubscribers: 
-subID (int) 
-msg1 (tinyint) 
-msg2 (tinyint) 
-msg3 (tinyint) 
-email (varchar) 

tbmessage 
-id (int) 
-name (varchar) 
-mitteilung (varchar) 
-sender (varchar) 
-datum (datetime) 

Фактические сообщения в таблице tbmessage и проверить, какие сообщения пользователь хочет видеть, что есть таблица tbsubscribers.

Теперь я хочу отображать сообщения. Поэтому, если пользователь подписался на msg1 и msg2 (поэтому значение обоих равно 1), он должен выбрать все данные из tbmessage, который имеет имя 'msg1' и 'msg2'.

Я знаю, как работать с select в mysql, но не знаю, как я мог выбрать несколько таблиц, и особенно в этом случае я немного смущен, как бы это сделать.

Любая помощь будет оценена

ответ

0

простое соединение должно работать:

SELECT * FROM `tbsubscribers` s 
RIGHT JOIN `tbmessage` tb ON (
    CASE WHEN msg1 = 1 THEN name = 'msg1' END OR 
    CASE WHEN msg2 = 1 THEN name = 'msg2' END OR 
    CASE WHEN msg3 = 1 THEN name = 'msg3' END 
) 

Я создал sqlfiddle here, который должен продемонстрировать функциональность, которую вы ищете.

Я собираюсь внести некоторые изменения, чтобы уточнить, как вы должны это делать, используя как указанный выше запрос, так и другой запрос, если это необходимо.

Есть несколько способов сделать это. Путь # 1:

<?php 

/* 
* If you already have username (email) in session, 
* then you can do this: 
*/ 

$query = "SELECT m.* FROM `tbsubscribers` s 
RIGHT JOIN `tbmessage` m ON (
    CASE WHEN msg1 = 1 THEN name = 'msg1' END OR 
    CASE WHEN msg2 = 1 THEN name = 'msg2' END OR 
    CASE WHEN msg3 = 1 THEN name = 'msg3' END 
) 
WHERE email = " . my_escape_string_function($_SESSION['username']); 

/* 
* If tbsubscribers has a '1' in msg1, then all msg1's are grabbed. 
* If tbsubscribers has a '2' in msg2, then all msg2's are grabbed...etc 
*/ 

//Set $rows equal to the result 

return $rows; 

?> 

Way # 2:

<?php 

/* 
* If you already have username (email) in session, 
* then you can do this: 
*/ 

$query = "SELECT * FROM `tbsubscribers` s 
WHERE email = " . my_escape_string_function($_SESSION['username']); 

/* 
* Run this query, and fetch the entire userrow, and put into $user 
* An alternative could be to just store the entire user array into 
* $_SESSION, as you wont have to query the database twice. 
*/ 

$tofetch = array(); 

for ($i=1; $i<=3; $i++) 
{ 
    //Let's check msg1, msg2, msg3 
    if ($user['msg' . $i]) 
    { 
     $tofetch[] = "name = 'msg" . $i . "'"; 
    } 
} 

/* 
* If tbsubscribers has a '1' in msg1, and a '1' in msg2 then the array 
* will look like this: 
* array(
* 0 => "name = 'msg1'" 
* 1 => "name = 'msg2'" 
*) 
*/ 

//Throw an exception if all 'msg1', 'msg2', and 'msg3' are all 0 (Otherwise the query will fail) 
if (empty($tofetch)) { 
    throw new Exception("You're not subscribed to any messages."); 
} 

/* 
* Now it's a simple query. $tofetch will be imploded, to form a nice 
* where statement. Using the example above, it will look like: 
* name = 'msg1' OR name = 'msg2' 
*/ 
$query = "SELECT * 
FROM `tbmessage` 
WHERE " . implode(' OR ', $tofetch); 

//Set $rows equal to the result 

return $rows; 
+0

и вывода данных будет работать так же, с другой таблицей? echo $ row ["name"]; – jerryp177

+0

Я все еще исправляю это: я предполагаю, что msg1 подобен '0' или' 1', и если это '1', вы хотите, чтобы он захватил все из другой таблицы, где' name = 'msg1' «Правильно? Есть ли что-то еще, связывающее две таблицы вместе? – FrankerZ

+0

нет, это все. Точно, если msg1 = 1 показывает все из этой таблицы – jerryp177

Смежные вопросы