Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Получить данные из двух таблиц

Доброго времени суток!
Есть две таблицы
MySQL
1
2
3
4
5
CREATE TABLE `test1` (
  `uid` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY  (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
MySQL
1
2
3
4
5
CREATE TABLE `test2` (
  `uid` int(10) unsigned NOT NULL auto_increment,
  `flags` varchar(20) NOT NULL,
  PRIMARY KEY  (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Вывожу:
PHP
1
2
3
4
$query = "SELECT * FROM test1, test2 WHERE test1.uid = '".mysql_real_escape_string($_GET['usrid'])."'";
$result = mysql_query($query) or die ("ERROR: ".mysql_error());
$row = mysql_fetch_array($result);
    echo $row['name'].'~'.$row['frags']; // Выводим данные
В таблице есть четыре пользователя и у всех поголовно выводится флаг z, на деле у ID 1 должен быть флаг z, у ID 2 флаг a.
Где-то допустил ошибку, но не пойму где.
Ответ: Уважаемые пользователи этого форума подскажите пожалуйста как изменить таблицу и её данные для её нормальной работы а именно,вот пример в котором проводится выборка данных по выбору из выпадающих списков и вот такой-же пример но только сортировки без выборки вот скрипт двух таблиц
PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    <table align= "center" border = 1>
                <tr>
                    <td width="50"><a href="?orderby&key=number&sort=<?=$sort . $values?>">Номер</a></td>
                    <th width='50'><a href="?orderby&key=city&sort=<?=$sort . $values?>">Місто</a></th>
                    <th width='50'><a href="?orderby&key=name&sort=<?=$sort . $values?>">Назва</a></th>
                    <th width='50'><a href="?orderby&key=sleeper&sort=<?=$sort . $values?>">Гостей</a></th>
                    <th width='50'><a href="?orderby&key=bedroom&sort=<?=$sort . $values?>">Спальні</a></th>
                    <th width='50'><a href="?orderby&key=price&sort=<?=$sort . $values?>">Ціна</a></th>
                    </th></tr>
                <? foreach($city as $key=>$value) { ?>
                    <tr>
                        <td><?=$number[$key]?></td>
                        <td><?=$value?></td>
                        <td><?=$name[$key]?></td>
                        <td><?=$sleeper[$key]?></td>
                        <td><?=$bedroom[$key]?></td>
                        <td><?=$price[$key]?></td>
                    </tr>
                <? } ?>
            </table>
        <?PHP } else {?>
            <p>По вашему запросу, ничего не найдено.</p>
        <?PHP }?>
    </div>
это одна в которой работает выборка и вот таблица в которой работает сортировка
PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  <?PHP if($city){?>
            <table align= "center" border = 1>
                <tr>
                    <td width="50"><a href="?orderby&key=number&sort=<?=$sort . $values?>">Номер</a></td>
                    <th width='50'><a href="?orderby&key=city&sort=<?=$sort . $values?>">Місто</a></th>
                    <th width='50'><a href="?orderby&key=name&sort=<?=$sort . $values?>">Назва</a></th>
                    <th width='50'><a href="?orderby&key=sleeper&sort=<?=$sort . $values?>">Гостей</a></th>
                    <th width='50'><a href="?orderby&key=bedroom&sort=<?=$sort . $values?>">Спальні</a></th>
                    <th width='50'><a href="?orderby&key=price&sort=<?=$sort . $values?>">Ціна</a></th>
                    </th></tr>
            <?php foreach ( $dataArray as $num=>$numArray ) { ?>
                    <tr>
                        <td><?php echo $dataArray[$num]['number']?></td>
                        <td><?php echo $dataArray[$num]['city']?></td>
                        <td><?php echo $dataArray[$num]['name']?></td>
                        <td><?php echo $dataArray[$num]['sleeper']?></td>
                        <td><?php echo $dataArray[$num]['bedroom']?></td>
                        <td><?php echo $dataArray[$num]['price']?></td>
                    </tr>
                    <?php } ?>
            </table>
        <?PHP } else {?>
как совместить или изменить эти таблицы чтобы работала и сортировка и выборка???
Вопрос: Поиск по двум таблицам

Как произвести поиск по двум таблицам, которые не связанны между собой. Формулировка запроса: Вывести название определенных лекарств. У меня есть две таблицы (Готовые лекарства и Изготовляемые лекарства) они между собой никак не связаны, но название лекарства нужно искать в двух таблицах. Вот то что у меня получилось, но оно ищет только в таблице Готовые лекарства. Как сделать чтобы в двух таблицах искало
Код SQL
1
2
3
4
SELECT isnull ([Готовые лекарства].Название,rtrim ([Изготовляемые лекарства].Название)) AS Название
FROM [Готовые лекарства], [Изготовляемые лекарства]
WHERE [Готовые лекарства].Название LIKE 'А%'
        AND [Изготовляемые лекарства].Название LIKE 'А%'
Ответ:
Цитата Сообщение от Grossmeister Посмотреть сообщение
Во-первых, вполне можно было обойтись одной таблицей.
Во-вторых, если есть запросы к несвязанным таблицам, то такие запросы объединяются по UNION [ALL]
По заданию должно быть две таблицы, понятно что одной можно было обойтись, но против задания не пойдешь. Спасибо за помощь
Вопрос: Объединение двух таблиц

есть две таблицы, состоящие из одного столбца

первая
1
2
3

вторая
4
5

нужно объединить их в третью, состоящую из двух столбцов по принципу всех записей со всеми:

1 4
1 5
2 4
2 5
3 4
3 5

как это сделать с помощью запроса?
Ответ:
Сообщение от drukin
то же самое что и здесь получилось - Объединение двух таблиц
Нет, не так. По ссылке декартово умножение 2 таблиц, где количество записей равно произведению записей обоих таблиц, в представленной БД это будет 30 (10 * 3). По моему варианту количество записей равно 10, т.е. равноCount(Таблица1.*), а последовательность f1 из второй таблицы тождественна Вашему примеру в Таблица3. ТЗ выполнено.
Вопрос: Как связать две таблицы (столбец типа uniqueidentifier-столбец типа xml)?

В одной таблице столбец типа uniqueidentifier, в другой - типа xml. Внутри xml-евского столбца такие данные:

<dictionary>
<item>
<key>
<string>MKSBGUID</string>
</key>
<value>
<string>740dc6b5-efae-4558-a226-656483b03dd7</string>
</value>
</item>
</dictionary>

Нужно связать эти две таблицы в запросе select. Как это сделать, учитывая тип xml?
Ответ:
seg856
a_voronin, да. В обеих таблицах эти значения уникальны.

---- если у вас одна запись(и один узел в xml) на каждый GUID в обоих таблицах то ничего множить НЕ ДОЛЖНО
CREATE TABLE #T(X XML,id int)
INSERT INTO #T (X,id) VALUES(N'<dictionary>
<item>
<key>
<string>MKSBGUID</string>
</key>
<value>
<string>740dc6b5-efae-4558-a226-656483b03dd7</string>
</value>
</item>
</dictionary>',1)
,(N'<dictionary>
<item>
<key>
<string>MKSBGUID</string>
</key>
<value>
<string>740dc6b5-efae-4558-0000-656483b03dd7</string>
</value>
</item>
</dictionary>',2)


CREATE TABLE #U(U uniqueidentifier,res varchar(100))
INSERT INTO #U (U,res) VALUES('740dc6b5-efae-4558-a226-656483b03dd7','связать две таблицы (столбец типа uniqueidentifier-столбец типа xml')
,('740dc6b5-efae-4558-0000-656483b03dd7','другой идентификатор')

SELECT U.res,T.ID
FROM #T T 
CROSS APPLY T.X.nodes('/dictionary/item[key/string = "MKSBGUID"]') XX(I)
JOIN #U U ON U.U = XX.I.value('(./value/string)[1]', 'uniqueidentifier')
GO
DROP TABLE #T
DROP TABLE #U

---- ищите дублирующие узлы или строки или поставьте DISTINCT
SELECT DISTINCT u.FAMILY, u.Name, u.OT, t.N_NWDS
FROM hlt_notworkdoc T CROSS APPLY T.xmldata.nodes('/dictionary/item[key/string = "MKSBGUID"]') XX(I)
JOIN Life_stt_MedicalHistory U ON U.UGUID = XX.I.value('(./value/string)[1]', 'uniqueidentifier') 
Вопрос: Перекрестное связывание двух таблиц

Привет всем.

Гугл спрашивал, не нашел ответа. В FAQ смотрел, тоже не нашел ответа.

Я мигрирую с SQLite, может быть он позволяет себе лишнего.
Версия Firebird 2.5.

Хочу: Связать две таблицы по внешним ключам.
"AA" ссылается на "BB" , "BB" ссылается на "AA"

делаю:
CREATE TABLE AA (
  aa_id integer NOT NULL PRIMARY KEY
  ,bb_id integer NOT NULL  
  ,CONSTRAINT c_bb_id FOREIGN KEY(bb_id)
    REFERENCES bb(id) ON DELETE NO ACTION
  )  ;


CREATE TABLE BB (
  bb_id integer NOT NULL PRIMARY KEY
  ,aa_id integer NOT NULL  
  ,CONSTRAINT c_aa_id FOREIGN KEY(aa_id)
    REFERENCES aa(id) ON DELETE NO ACTION
  )  ;


Проблема: в первом операторе ругается что таблицы BB не существует. Sqlite это нормально обрабатывал.

Вопрос 1: Поддерживает ли Firebird такие связи?

Вопрос 2: Можно ли как-то сделать это внутри оператора CREATE TABLE и не городить ALTER TABLE на добавление ограничения внешнего ключа?

Вопрос 3: Каким способом это принято делать в Firebird ?
Ответ:
Алексей Васильев
Привет всем.

Гугл спрашивал, не нашел ответа. В FAQ смотрел, тоже не нашел ответа.

Я мигрирую с SQLite, может быть он позволяет себе лишнего.
Версия Firebird 2.5.

Хочу: Связать две таблицы по внешним ключам.
"AA" ссылается на "BB" , "BB" ссылается на "AA"

делаю:
CREATE TABLE AA (
  aa_id integer NOT NULL PRIMARY KEY
  ,bb_id integer NOT NULL  
  ,CONSTRAINT c_bb_id FOREIGN KEY(bb_id)
    REFERENCES bb(id) ON DELETE NO ACTION
  )  ;


CREATE TABLE BB (
  bb_id integer NOT NULL PRIMARY KEY
  ,aa_id integer NOT NULL  
  ,CONSTRAINT c_aa_id FOREIGN KEY(aa_id)
    REFERENCES aa(id) ON DELETE NO ACTION
  )  ;


Проблема: в первом операторе ругается что таблицы BB не существует. Sqlite это нормально обрабатывал.

Вопрос 1: Поддерживает ли Firebird такие связи?

Вопрос 2: Можно ли как-то сделать это внутри оператора CREATE TABLE и не городить ALTER TABLE на добавление ограничения внешнего ключа?

Вопрос 3: Каким способом это принято делать в Firebird ?

+ У тебя
У тебя в примере поля id, указанные в констреинт, не принадлежат таблице.

1. Поддерживает.
2. Нельзя. Ссылка должна быть на существующий объект.
3.Поэтапно:

CREATE TABLE AA (
    AA_ID  INTEGER NOT NULL,
    BB_ID  INTEGER NOT NULL
);

CREATE TABLE BB (
    BB_ID  INTEGER NOT NULL,
    AA_ID  INTEGER NOT NULL
);

ALTER TABLE AA ADD PRIMARY KEY (AA_ID);
ALTER TABLE BB ADD PRIMARY KEY (BB_ID);

ALTER TABLE AA ADD CONSTRAINT C_BB_ID FOREIGN KEY (BB_ID) REFERENCES BB (BB_ID);
ALTER TABLE BB ADD CONSTRAINT C_AA_ID FOREIGN KEY (AA_ID) REFERENCES AA (AA_ID);
Вопрос: Выборка из двух таблица, произвольная строка из дочерней

Добрый день,
Есть две таблицы - родительская и дочерняя. Соотношение - один ко многим.
Нужно выбрать все записи из родительской таблицы и для каждой записи по одной (именно по одной, а не все) соответсвующей из дочерней. Какую именно запись из соответствующих по ключам выбирать из дочерней - не важно.
Возможно ли решить задачу без использования group by примененному ко всему запросу?

Отвечая на потенциальный вопрос: почему без group by. На самом деле запрос уже существует, довольно сложный, динамически генерируемый в приложении, включающий в себя выборку из нескольких таблиц связанных определенными условиями. Нужно расширить, добавив выборку из "дочерней". Использование group by затруднит чтение кода динамического формирования.
Ответ:
Hello, Di Line!
You wrote on 11 января 2017 г. 13:36:11:

Di Line
> Бери первую, не ошибешься...
дайте две! (с)

Posted via ActualForum NNTP Server 1.5

Вопрос: Select из двух таблиц

Делаю поиск, есть две таблицы абонентов.
Поиск идет по лицевому счету либо имени -> из обеих нужно выбрать два первых поля - id (лицевой счет), name (фио)
abon_1 - id, name, ...
abon_2 - id, name, ...
Для выборки из одной таблицы делаю так:
Код:
$q = "SELECT `id`, `name` FROM `abon_1` WHERE `id` LIKE '%$query%' OR `name` LIKE '%$query%'";

Копал в эту сторону:
Пробовал так:
Код:
$q = "SELECT a.id, a.name, b.id, b.name FROM abon_1 AS a, abon_2 AS b, WHERE a.id LIKE '%$query%' OR b.id LIKE '%$query%' OR a.name LIKE '%$query%' OR b.name LIKE '%$query%'";

Не работает =\
Прошу не бросаться тапками, можно ли вообще в случае с такими таблицами сделать подобную выборку?
Ответ:
MiksIr писал(а):В примере на тостере таблицы со связанными данными. А у вас, как я понял, обе таблицы - один набор данных, т.е. как бы одна таблица продолжение другой. Гуглите в сторону UNION

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

Всем доброго вечера!

Прошу помощи на составление sql-запроса.

Задача: есть две таблицы - users и orders. Надо сделать выборку всех заказов конкретного пользователя.

Что-то вроде такого:

SQL
1
2
3
4
SELECT USER.id,
       USER.name
FROM `users` USER WHERE USER.id = 7
JOIN `orders` ON id_user = USER.id
Но это не работает. Где тут ошибка?

Добавлено через 25 минут
Переписал запрос

SQL
1
2
3
SELECT * FROM users
JOIN orders ON orders.id_user = users.id
WHERE users.id = 7
Но все равно не работает. Почему?

Добавлено через 24 минуты
В общем все переигралось, но все равно не получается выполнить задачу.

Есть три таблицы:

tasks - задания
tags - теги к заданиям
relation - отношения между заданиями и тегами

таблица tasks

id | name | desc

Таблица tags

id | title

Таблица relation

id_tag | id_task

Вот как мне правильно построить запрос, чтобы выбрать один task и все его теги?
Ответ: sending, в таблице relation не хватает поля, которое являлось бы первичным ключом. Таблица, развязывающая tags и tasks должна выглядеть так:
relation - id_r|id_tag|id_task
Запрос будет такой (при неявном объединении):
SQL
1
SELECT q.name, w.title FROM tasks q, tags w, relation e WHERE q.id=e.id_task AND w.id=e.id_tag
В вывод можно добавить еще поля, если интересует какой-то конкретный id task'а, то дописываем: and q.id=N
Вопрос: Выборка связных таблиц с тегами

Две таблицы:

(Relationship)
video_id | tag_id
------------------
1 | 1
1 | 2
2 | 1

(Tags)
id | tag_name
--------------------
1 | Action
2 | Strategy

Нужно получить выборку video_id из таблицы Relationship где присутствуют оба тега и "Action" и "Strategy". Поэтому video_id = 2 точно не должен быть в выборке.
Вобщем делаю такой запрос:
select * from relationship a left join tags b on a.tag_id = b.id
where b.tag_name in('Action', 'Strategy');
У меня выводятся все три строки что неверно, вобщем то понятно что in предполагает любое из этих тегов, необходимо сделать проверку по AND.
Ответ: PgSQLanonymous3
спасибо , добрый человек
немного поясню,, что думал я
PgSQLanonymous3
А это, наверное, как-то так:
SELECT *
  FROM video AS v -- таки само видео, а не связи
 WHERE EXISTS (
	  SELECT 1
	    FROM relationship AS re
            JOIN tags AS t
	      ON t.id = re.tag_id
	   WHERE re.video_id = v.video_id AND t.tag_name = 'Action'
       )
   AND EXISTS (
	  SELECT 1
	    FROM relationship AS re
            JOIN tags AS t
	      ON t.id = re.tag_id
	   WHERE re.video_id = v.video_id AND t.tag_name = 'Strategy'
       );

qwwq
всё примерно так, как вы написали, но проще не каунты считать, а содержимость ключей в array_agg(tag_id). для этого операторы пересечения/вхождения массивов существует

А это примерно так:
SELECT video_id --, tags
  FROM (
       SELECT video_id, ARRAY_AGG(tag_id) AS tags
         FROM Relationship
/*         WHERE tag_id IN(SELECT tag_id
                                       WHERE tag_name =ANY(ARRAY['Action', 'Strategy'])
*/ -- оптимизация для реляционной структуры, если тегов в среднем 100-ни
       GROUP BY video_id 
       ) AS video_tags     -- а это 
                                      --сама таблица видео с массивным полем тагов, вместо 1--N
 WHERE tags @> (SELECT ARRAY_AGG(id)
                  FROM tags
                WHERE tag_name =ANY(ARRAY['Action', 'Strategy'])
                                            -- один массивный параметр
               )
-- т.е. скорее болванка для альтернативного способа
-- хранения связей в массивах при видео
Вопрос: Выборка из двух таблиц с использованием функции MAX

Здравствуйте!
Требуется создать запрос из двух таблиц.
Некоторые столбцы первой таблицы (Ассортимент): Код, Наименование, Остаток.
Некоторые столбцы второй таблицы (Приход): Код, Дата прихода, Количество, Фирма.
В первом таблице код уникален и более 5000 записей, т.е. больше 5000 наименований товаров.
Во втором таблице больше 100000 записей и с каждой фирмы (их 10) сделали минимум 3 раза прихода каждого ассортимента.
Надо создать запрос для получения данных из одной фирмы, например "Оптима":
Код, Наименование, Остаток, Дата последнего прихода, Количество.
Ответ: Chessmaster, у Вас групповой запрос по всем полям табл Приход для фирмы Оптима дает на 5 записей меньше (2156), чем количество записей из той же табл после применения фильтра "Оптима" (2171), т.е. 6 записей в таблице одинаковы, нужно их найти и удалить(изменить),после чего проиндексировать таблицу. Запрос:
Код SQL
1
2
3
4
SELECT Код, [Кол-во], Фирма, Дата
FROM Приход
GROUP BY Код, [Кол-во], Фирма, Дата
HAVING (((Приход.Фирма)="Оптима"));