2011-03-04 5 views
0

Мне нужно вернуть одну строку с некоторыми данными, взятыми из некоторых таблиц, не связанных друг с другом.MySql - Лучший способ сделать такой запрос

Так, например, мои фактические запросы это (я сделал это trought РНР скрипт):

$query=mysql_query("SELECT trackid FROM tracklist WHERE usersub='".$_SESSION['nickname']."'",$mydb); 
echo mysql_num_rows($query); 
$query=mysql_query("SELECT trackid FROM comments WHERE usercom='".$_SESSION['nickname']."'",$mydb); 
echo mysql_num_rows($query); 
$query=mysql_query("SELECT vote FROM vote WHERE uservote='".$_SESSION['nickname']."'",$mydb); 
echo mysql_num_rows($query); 
$query = mysql_query("SELECT datereg FROM users WHERE nickname='".$_SESSION['nickname']."'",$mydb); 
echo mysql_result($query,0,'datereg'); 

Но это вызов сервера MYSQL 4 раза. Какое ваше предложение улучшить эту ситуацию?

+1

Ну вы 4 таблицы, эрго 4 DB называет :) – benhowdle89

ответ

1

Вы можете use a UNION. И, кстати, mysql_resultis poor. И FFS не забывайте санировать ваши входы!

<?php 
$nickname = mysql_escape_string($_SESSION['nickname']); 

$sql = " 
    SELECT COUNT(trackid) AS n FROM tracklist WHERE usersub='{$nickname}' 
    UNION 
    SELECT COUNT(trackid) FROM comments WHERE usercom='{$nickname}' 
    UNION 
    SELECT COUNT(vote) FROM vote WHERE uservote='{$nickname}' 
    UNION 
    SELECT datereg FROM users WHERE nickname='{$nickname}' 
"; 

$result = mysql_query($sql, $db); 

while ($row = mysql_fetch_assoc($result)) { 
    echo $row['n']; 
} 
?> 

Я бы не рекомендовал это, как это немного беспорядка, сочетающий ценность «подсчет» с датой в том же колонке, но вы можете сделать это. Это прямой ответ на ваш вопрос.

+0

Я думаю, что '$ ник = mysql_escape_string ($ _ SESSION [ 'ник']); 'не нужно! Фактически эта переменная хранится, беря ее из базы данных (которая уже отфильтрована после ее вставки). Спасибо за предложения :) – markzzz

+0

@markzzz: Просто потому, что вы вынимаете его из базы данных, это не значит, что он не содержит косой черты или кавычки. –

+0

Да! Я отфильтровал его, прежде чем добавить его! Его «псевдоним», поэтому только [a-z], [0-9] и _ или. – markzzz

2

Если таблицы не связаны, то вам придется сделать 4 раздельные звонки

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

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

0

Ну, вы можете создать пятую таблицу и использовать ее в качестве индекса.

Если все значения {trackid, vote, datareg} являются целыми числами, таблица индексов может содержать три столбца - псевдоним, значение и таблицу. Когда вы добавляете записи в одну из других таблиц, добавьте соответствующую запись в таблицу индексов.

Например, INSERT INTO vote (vote, uservote, ...) VALUES (123, 'abc', ...); INSERT INTO myindex (псевдоним, nvalue, ntable) VALUES ('abc', 123, 'vote');

(я бы на самом деле хранить имя таблицы в виде строки, но как числовое значение, но вы получите идею)

Тогда на запрос, вы просто выбираете nvalue, ntable FROM myindex WHERE ник = ' а '; Возможно, вы получите более одного ряда.

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

0

Вы пробовали комбинируя отборное заявление вместе, как

SELECT, .. На самом деле.

Может быть, вы должны нормализовать базу данных и установить связи между вашими таблицами ...

Edit :: И я не уверен, как вы готовите себя от инъекций MySQL, но будьте осторожны с тем, где вашим $ _SESSION [] исходит от

0

Если все выбирает возвращать одну строку:

$query=mysql_query(" 
    (SELECT trackid FROM tracklist WHERE usersub='".$_SESSION['nickname']."'") as tracklist, 
    (SELECT trackid FROM comments WHERE usercom='".$_SESSION['nickname']."'") as trackid, 
    (SELECT vote FROM vote WHERE uservote='".$_SESSION['nickname']."'") as vote, 
    (SELECT datereg FROM users WHERE nickname='".$_SESSION['nickname']."'") as datereg 
" 
Смежные вопросы